2013-12-11 45 views
2

我試着譴責其他答案,沒有運氣,因此問。MySQL分組 - 通過零計數獲取列

我有一個桌子和幾個類似這樣的一年 這裏是表結構

-------------------------------- 
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狀態,我想查看與狀態計數相對應的所有條目,包括零計數。

如果我在谷歌搜索,我會得到這樣的事情

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的人也可以像下面那樣展示。

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

我已閱讀關於連接和東西,仍然不清楚。任何幫助將非常感激。

+1

如果這是一個您可以控制的正在進行的項目,您應該嘗試對數據進行標準化處理。按照你現在的結構,我看到把它分成三張表。 – Tony

回答

2

計數只返回了,他認爲微軟的狀態計數。而那些被拒絕和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 

此找到所有的狀態成爲可能。如果您擁有包含所有可能狀態的參考表,則更好使用它來代替此查詢。

然後,您通過status和companyName在此表上執行LEFT JOIN。這樣,如果表中有記錄,則只會在STATUS中獲得匹配。如果有,你加1的總和,否則你添加0

sqlfiddle demo

+0

優秀的Filipe!奇蹟般有效。謝謝 ! – Kumar

0

您可以嵌套查詢,並搜索當計數等於或大於零:

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

+0

這沒有奏效。 – Kumar

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

+0

謝謝Joachim。很棒! – Kumar