MySQL Group by - 获取零计数的列

时间:2013-12-11 19:56:57

标签: mysql sql

我试着谴责其他答案,没有运气,因此要求。

我有一张桌子,其他几年与此相似 这是表结构

--------------------------------
STATUS       | Year | Company Name 
--------------------------------
Certified    | 2010 | Google
Cert-Denied  | 2010 | Google 
Denied       | 2010 | Google
Withdrawn    | 2010 | Google

Denied       | 2010 | Microsoft
Withdrawn    | 2010 | Microsoft
Certified    | 2010 | Apple
Cert-Denied  | 2010 | Apple
----------------------------------

当我写一个查询列出一年中所有公司GROUP BY STATUS时,我希望看到所有与状态计数相对应的条目,包括零计数。

如果我在Google上搜索,我会得到类似的内容

Query : Select status, count(*) from table where company like '%Google%' group by status

结果:

Certified    | 1| 
Cert-Denied  | 1| 
Denied       | 1| 
Withdrawn    | 1| 

如果我为微软运行相同的操作,我会得到

Denied       | 1|
Withdrawn    | 1 |

缺少ZERO Count的人。我希望那些带有ZERO Count的人也可以像下面那样被删除。

Certified    | 0| 
Cert-Denied  | 0| 
Denied       | 1| 
Withdrawn    | 1| 

我已阅读过有关连接和内容的内容,但仍不清楚。任何帮助将非常感激。

3 个答案:

答案 0 :(得分:2)

COUNT仅返回他为Microsoft找到的状态的COUNT。那些是Denied和Wthdrawn。您必须为查询提供所有状态,并计算所有状态的出现次数。未出现的那些将在表格中留下0:

SELECT a.STATUS, 
      SUM(CASE 
        WHEN b.STATUS IS NOT NULL
          THEN 1
        ELSE 0
      END) AS StatusCount
FROM (
  SELECT DISTINCT STATUS
  FROM tab1
  ) a
LEFT JOIN tab1 b ON a.STATUS = b.STATUS AND b.CompanyName = 'Microsoft'
GROUP BY a.STATUS;

这是做什么的:

SELECT DISTINCT STATUS
FROM tab1

这可以找到所有可能的状态。如果你有一个包含所有可能状态的参考表,那就更好用它而不是这个查询。

然后按状态和companyName对此表执行LEFT JOIN。这样,如果表中有记录,您将只在STATUS中获得匹配。如果有,则向SUM添加1,否则添加0。

sqlfiddle demo

答案 1 :(得分:1)

一种相当直接的方法是获取所有不同的状态,并使用表格LEFT JOIN来获取计数;

SELECT a.status, COUNT(b.status) cnt
FROM (SELECT DISTINCT status FROM Table1) a
LEFT JOIN Table1 b
  ON a.status = b.status
 AND b.`Company name`='Microsoft'
GROUP BY a.status

An SQLfiddle to test with

答案 2 :(得分:0)

您可以嵌套查询,并在Count等于或大于零时搜索:

SELECT a.status, a.stat_count FROM (SELECT status, count(*) as stat_count FROM table where company like '%Google%' GROUP BY status) a WHERE a.stat_count >= 0