2016-05-11 11 views
0

私はSQLクエリを持っていますが、何も入力しない場合は月を表示したいと思います。エントリがあるときにエントリを表示するだけです。月ごとのグループsql、エントリが書き込まれていないとき0

SELECT YEAR(T0.[Recontact]) AS 'Év', MONTH(T0.[Recontact]) AS 'Hónap', 
      T1.[SlpName], COUNT(T0.[ClgCode]) AS 'Tárgyalások' 
    FROM OCLG T0 
    INNER JOIN OSLP T1 ON T0.[SlpCode] = T1.[SlpCode] 
    WHERE T0.[Action] = 'M' AND 
    T0.[Recontact] >= 'date' AND 
    T0.[Recontact] <= 'date2' AND 
    T1.[SlpName] = 'user name' 
    GROUP BY YEAR(T0.[Recontact]), MONTH(T0.[Recontact]), T1.[SlpName] 
    ORDER BY 1,2 
+0

これは本当にMySQLですか? (私はSQL Serverを推測していただろう...) – jarlh

+0

[SQL SERVERクエリでゼロカウントを表示する方法](http://stackoverflow.com/questions/31152702/how-to-show-zero-count- in-sql-server-query) – pilcrow

答えて

0

NULL結果を取得するために、INNER JOINをLEFT JOINに置き換えてください。

SELECT YEAR(T0.[Recontact]) AS 'Év', MONTH(T0.[Recontact]) AS 'Hónap', 
     T1.[SlpName], COUNT(T0.[ClgCode]) AS 'Tárgyalások' 
FROM OCLG T0 
LEFT JOIN OSLP T1 ON (T0.[SlpCode] = T1.[SlpCode] 
         AND T1.[SlpName] = 'user name') 
WHERE T0.[Action] = 'M' 
    AND T0.[Recontact] >= 'date' 
    AND T0.[Recontact] <= 'date2' 
GROUP BY YEAR(T0.[Recontact]), MONTH(T0.[Recontact]), T1.[SlpName] 
ORDER BY 1,2 
+0

迅速な答えをありがとう!しかし、それ大丈夫ではない私が思うに、私はここでそれを試すの結果である: 2015 1 NULL 343 2015 2 NULL 195 2015 2グッド名48 良い結果はこのようになります。 2015 1良い名前0 2015 2良い名前48 など – Peter

0

NULL結果を取得するために、INNER JOINをLEFT JOINに置き換えてください。年+月は完全にあなたのデータから欠落している場合は、あなたの場所に表示することができますどこかの空の行を構築する必要があります http://academy.comingweek.com/sql-groupby-clause/

+0

ありがとう、私はそれを試してみましたが、すべてが間違っています。 2015 02名48 しかし、私はこのようにも、最初の月必要があります: さて、私の結果は 2015 01名0 2015 02名48 – Peter

1

:より多くの訪問を学ぶため 。カレンダー表(1日に1行)または月表(1月に1行)を作成できます。これは、CTEなどで構築された「仮想」集計表でもあります。

あなたはあなたがすることができる、ということ。このような何かたら:

select 
    M.Year, M.Month, X.SlpName, isnull(X.CODES,0) as CODES 
from 
    months M 
    outer apply (
    SELECT 
     YEAR(T0.[Recontact]) as Year, 
     MONTH(T0.[Recontact]) AS Month, 
     T1.[SlpName], 
     COUNT(T0.[ClgCode]) AS CODES 
    FROM OCLG T0 
    INNER JOIN OSLP T1 ON T0.[SlpCode] = T1.[SlpCode] 
    WHERE T0.[Action] = 'M' AND 
    T0.[Recontact] >= 'date' AND 
    T0.[Recontact] <= 'date2' AND 
    T1.[SlpName] = 'user name' 
    GROUP BY YEAR(T0.[Recontact]), MONTH(T0.[Recontact]), T1.[SlpName] 
) X on X.Year = M.Year and X.Month = M.Month 
where M.MONTHDATE >= 'date' and M.MONTHDATE <= 'date2' 
ORDER BY 1,2 

をこれは、年、月とmonthdate列を持つ仮想の月のテーブルとあった、と日付は月の最初のです - 引き続き取得している範囲が正しいことを確認する必要があります。

これはテストしていませんが、動作するはずです。

+0

がコードをテストしていませんが、このアプローチは、単に変更よりも優れています他の答えと同じように結合タイプ。 CTEまたは月表を使用した日付表は、ソースデータに何も存在しない月を得る方法です。 –

関連する問題