小编典典

MySQL Group by-获取零计数的列

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|

如果我为Microsoft运行相同的软件,我会得到

Denied       | 1|
Withdrawn    | 1 |

零计数的那些丢失。我希望零计数的那些也像下面这样消失。

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

我已经阅读了有关联接和内容的信息,但仍不清楚。任何帮助将非常感激。


阅读 172

收藏
2021-04-07

共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)

2021-04-07