2013-02-06 83 views
11

我只是想知道是否有任何方法使用一個查詢從表中獲取兩個單獨的「計數」總計?也就是說,使用類似於以下的表我想檢索每個代碼(不同的)並顯示狀態的總數「不等於X或D,然後有一個額外的列顯示狀態的總數」相等到X或D並且取消日期大於給定日期(例如,最近14天)。SQL:具有不同標準的多個計數語句

表:

Code: Status Cancel_Date 
----------------------------------- 
AAA X  2012-02-01 
AAA 
BBB X  2012-02-01 
AAA D  2012-01-01 
AAA 
BBB  
BBB D  2012-02-01 
BBB X  2012-01-01 

實施例的結果(基於上面的數據):

Code: TotalNotXorD  TotalXorD 
------------------------------------ 
AAA 2    1 
BBB 1    2 

TotalNotXorD:例如

select code, count(*) 
from table 
where status not in('X','D') 
group by code 

總數:例如

select code, count(*) 
from table 
where status in('X','D') 
    and cancel_date >= '2012-02-01' 
group by code 

我看過做子查詢等,但我似乎無法得到我需要的結果。

任何想法?

謝謝。

+0

您正在使用什麼數據庫? – Michas

回答

37

SELECT a.code, 
     COALESCE(b.totalNotXorD, 0) totalNotXorD, 
     COALESCE(c.totalXorD, 0) totalXorD, 
FROM (SELECT DISTINCT Code FROM tableName) a 
     LEFT JOIN 
     (
      select code, count(*) totalNotXorD 
      from table 
      where status not in('X','D') 
      group by code 
     ) b ON a.code = b.code 
     LEFT JOIN 
     (
      select code, count(*) totalXorD 
      from table 
      where status in('X','D') 
       and cancel_date >= '2012-02-01' 
      group by code 
     ) c ON a.code = c.code 

或簡單地做CASE

SELECT Code, 
     SUM(CASE WHEN status NOT IN ('X','D') OR status IS NULL THEN 1 ELSE 0 END) TotalNotXorD, 
     SUM(CASE WHEN status IN ('X','D') AND cancel_date >= '2012-02-01' THEN 1 ELSE 0 END) TotalXorD 
FROM tableName 
GROUP BY Code 
+0

感謝您的回覆JW。我已經嘗試過了,但是我收到以下錯誤,與我自己遇到的問題類似:錯誤:列'status'在選擇列表中無效,因爲它不包含在聚合函數或GROUP BY中條款。 (狀態:37000,本機代碼:1FB8) 錯誤:列狀態在選擇列表中無效,因爲它未包含在聚合函數或GROUP BY子句中。 (狀態:37000,本機代碼:1FB8) – jj2

+0

查看我更新的答案。順便說一句,你正在使用什麼rdbms? –

+0

請參閱此處演示http://www.sqlfiddle.com/#!2/aba2a/2 –