2017-09-06 8 views
1

存在しない場合、私は私は、レコードここにデータを取得したいレコードが特定の月に

特定の月内のすべてのレコードが起こる取得するには、SQLクエリを書いた
select month(loggingdate),Count(id) from communicationlogs 
where clientid=20154 and month(loggingdate) in (1,2,3,4,5,6,7,8,9) 
group by month(loggingdate) 

7 65 
8 5 

は7,8ヶ月中に存在しています。私は他の月の数字に0をつけたいです。

1 0 
2 0 
3 0 
4 0 
... 

答えて

1

これは、カレンダーテーブルが便利な標準的な問題です。名前が示すように、カレンダーテーブルは、日付のシーケンスを格納するテーブルです。あなたの特定のケースでは、12ヵ月に対応する数字だけが必要です。カレンダー表を使用して照会を開始し、次に集約照会をサブクエリーとして左結合します。

下記のCOALESCEの使用に注意してください。指定した月が元のクエリのどこにも表示されない場合、その数は結合でNULLと表示されます。この場合、その月にゼロが報告されます。

WITH calendar_month AS (
    SELECT 1 AS month 
    UNION ALL 
    SELECT month +1 
    FROM 
    calendar_month 
    WHERE month +1 <= 12 
) 

SELECT 
    t1.month, 
    COALESCE(t2.cnt, 0) AS cnt 
FROM calendar_month t1 
LEFT JOIN 
(
    SELECT 
     MONTH(loggingdate) as month, 
     COUNT(id) AS cnt 
     FROM communicationlogs 
     WHERE 
      clientid = 20154 AND 
      MONTH(loggingdate) IN (1,2,3,4,5,6,7,8,9) 
     GROUP BY MONTH(loggingdate) 
) t2 
    ON t1.month = t2.month 
+0

任意の簡単なクエリをお願いします。 –

+0

CTEを使用している場合、12個のSELECT文の代わりに1から12までの数値を生成するために再帰的にするのはいかがですか? '1 UNION \t \t NextRunDateように選択したすべての \t \t \tは \t \t \t NextRunDate + 1 <= 12' – Cosmin

+0

残念ながら、この \t \t \t CTE \t \t FROM \t \t \t \t NextRunDate 1 \t \tを選択しますちょうどそれが得るほど簡単です。カレンダー・テーブルを使用したくない場合は、ビジネスプロセスを変更して毎月0レコードをテーブルに書き込むことができます。これにより、毎月が常に出現することが保証されます。 –

関連する問題