我尝试谴责其他答案,但没有运气,因此提出了要求。
我有一张桌子,还有几张与其他年份类似的桌子
这是表结构
--------------------------------
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
----------------------------------
当我编写一个查询来列出一年中按状态分组的所有公司时,我想查看与状态计数相对应的所有条目,包括零计数。
如果我在谷歌上搜索我会得到这样的东西
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 |
计数为零的缺失。我希望计数为零的内容也能像下面这样显示。
Certified | 0|
Cert-Denied | 0|
Denied | 1|
Withdrawn | 1|
我读过有关联接之类的内容,但仍然不清楚。任何帮助将非常感激。
COUNT 仅返回他为 Microsoft 找到的状态的 COUNT。这些都被拒绝和撤回。您必须向查询提供所有状态并计算所有状态的出现次数。未出现的将在表中保留 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
这会找到所有可能的状态。如果您有一个包含所有可能状态的参考表,最好使用它而不是此查询。
然后,您按状态和公司名称对此表执行 LEFT JOIN。这样,只有当表中有记录时,您才会在 STATUS 中获得匹配项。如果有,则在 SUM 中加 1,否则加 0。
sqlfiddle demo
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)