我试着谴责其他答案,没有运气,因此要求。
我有一张桌子,其他几年与此相似 这是表结构
--------------------------------
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|
我已阅读过有关连接和内容的内容,但仍不清楚。任何帮助将非常感激。
答案 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。
答案 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
答案 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