2016-11-16 149 views
1

我有一個表[MY_TABLE]與以下數據:日期[DOCUMENT_DATE]和狀態[STATUS]。我想分開並計算3個不同的狀態:在狀態< 8時打開,當狀態= 8時丟失,或者當狀態> 8時按下月份和年份對它們進行分組。如何按月份和年份分組,並分隔條目?

最終結果將如下所示:year, month, count(won), count(lost), count(open),有效地給出每個月的每個狀態的計數。

幾個月沒有地位可言的(可以忽略),有些還只有一些狀態,而不是所有的人(應該寫年月正確)

我有一個工作的查詢,但現在它真的很大:

SELECT 
CASE WHEN "open".year IS NOT NULL 
    THEN 
     "open".year 
    ELSE 
    (CASE WHEN "lost".year IS NOT NULL 
     THEN 
     "lost".year 
    ELSE 
     "won".year 
    END) 
    END   AS "Année", 
    CASE WHEN "open".month IS NOT NULL 
    THEN 
     "open".month 
    ELSE 
    (CASE WHEN "lost".month IS NOT NULL 
     THEN 
     "lost".month 
    ELSE 
     "won".month 
    END) 
    END   AS "Mois", 
    "open".count AS "Ouvertes", 
    "lost".count AS "Perdues", 
    "won".count AS "Gagnées" 
FROM (SELECT 
     year([DOCUMENT_DATE]) AS "year", 
     MONTH([DOCUMENT_DATE]) AS "month", 
     COUNT(*)    AS "count" 
     FROM [MY_TABLE] 
     WHERE [STATUS] < 8 AND [DOCUMENT_DATE] >= ?1 AND [DOCUMENT_DATE] <= ?2 AND ([SEGMENT] = ?3 OR ?3 IS NULL) 
     GROUP BY YEAR([DOCUMENT_DATE]), MONTH([DOCUMENT_DATE])) AS "open" 
    FULL JOIN (SELECT 
       year([DOCUMENT_DATE]) AS "year", 
       MONTH([DOCUMENT_DATE]) AS "month", 
       COUNT(*)    AS "count" 
      FROM [MY_TABLE] 
      WHERE [STATUS] = 8 AND [DOCUMENT_DATE] >= ?1 AND [DOCUMENT_DATE] <= ?2 AND ([SEGMENT] = ?3 OR ?3 IS NULL) 
      GROUP BY YEAR([DOCUMENT_DATE]), MONTH([DOCUMENT_DATE])) AS "lost" 
    ON "open".month = "lost".month AND "open".year = "lost".year 
    FULL JOIN (SELECT 
       year([DOCUMENT_DATE]) AS "year", 
       MONTH([DOCUMENT_DATE]) AS "month", 
       COUNT(*)    AS "count" 
      FROM [MY_TABLE] 
      WHERE [STATUS] > 8 AND [DOCUMENT_DATE] >= ?1 AND [DOCUMENT_DATE] <= ?2 AND ([SEGMENT] = ?3 OR ?3 IS NULL) 
      GROUP BY YEAR([DOCUMENT_DATE]), MONTH([DOCUMENT_DATE])) AS "won" 
    ON "open".month = "won".month AND "open".year = "won".year 
ORDER BY CASE WHEN "open".year IS NOT NULL 
    THEN 
    "open".year 
     ELSE 
      (CASE WHEN "lost".year IS NOT NULL 
      THEN 
       "lost".year 
      ELSE 
       "won".year 
      END) 
     END, 
    CASE WHEN "open".month IS NOT NULL 
    THEN 
     "open".month 
    ELSE 
    (CASE WHEN "lost".month IS NOT NULL 
     THEN 
     "lost".month 
    ELSE 
     "won".month 
    END) 
END 

我很確定有一個更簡單,更乾淨的方法來做到這一點,但我無法弄清楚。

回答

5

我想這可能是你正在尋找的基礎上的描述。

SELECT year([DOCUMENT_DATE]) AS "year", 
     MONTH([DOCUMENT_DATE]) AS "month", 
     COUNT(case when [STATUS] > 8 then 1 end) win_count,  
     COUNT(case when [STATUS] = 8 then 1 end) lost_count, 
     COUNT(case when [STATUS] < 8 then 1 end) open_count 
FROM [MY_TABLE] 
GROUP BY year([DOCUMENT_DATE]),MONTH([DOCUMENT_DATE]) 
ORDER BY 1,2 

如果條件在所有計數中是共同的,則添加WHERE [DOCUMENT_DATE] >= ?1 AND [DOCUMENT_DATE] <= ?2 AND ([SEGMENT] = ?3 OR ?3 IS NULL)

+0

是的,我確定有更好的方法,但不是更好的方法。它甚至比我的功能更好,因爲當沒有任何東西時我的輸出爲空,而你的0更合乎邏輯。非常感謝你 ! – rbntd