我试着要求其他答案,但是没有运气,因此提出了要求。
我有一张桌子,其他年份也有几张类似的桌子,这是桌子的结构
-------------------------------- 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|
如果我为Microsoft运行相同的软件,我会得到
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
这将找到所有可能的状态。如果您有一个包含所有可能状态的参考表,甚至更好,请使用它代替此查询。
然后,您通过状态和companyName在此表上进行LEFT JOIN。这样,仅当表上有记录时,您才能在STATUS中获得匹配项。如果存在,则将1加到SUM,否则将添加0。
[sqlfiddle demo](http://sqlfiddle.com/#!2/b7cc3/9)