2016-09-05 20 views
0

null値の行を追加する方法はありますか?0で置き換えますか?SQL Server - NULL行が表示されていませんか?

理想的には、すべての月のデータを表示したい場合は、データがない場合はカウント列をゼロに設定します。

enter image description here

が、私はそれを下回る結果セットを取得するために以下のコードを使用しています...

現在、SQLクエリは空行を返すされていないと私はこのような出力を取得しています

 SELECT 
     DATENAME(MONTH,A.Date) 'Month', COUNT(LateStatus) 'Count', 'Late' 'Type' 
     FROM  
     Attendance1 A 
     WHERE 
     A.EnrollId = '10000' AND A.Date BETWEEN '2016-01-01' AND '2016-08-31' AND LateStatus = 'L' 
     GROUP BY 
     DATENAME(MONTH,A.Date) 
+0

カレンダーテーブルで左結合を使用します。あなたはここで多くの例を見つけることができます。 –

+2

あなたの質問とは無関係な勧告があります。列エイリアスには一重引用符を使用しないでください。 – shawnt00

+0

CTEを使用して*のカレンダーテーブル*をオンザフライで作成する –

答えて

1

再帰CTE(動的カレンダーテーブルを行う)を使用:

:これで、任意の発現のために使用することができる整数の範囲を生成するために、

With Months(mon) As 
    (Select dateAdd(month, datediff(month, 365, getdate()), 0) 
    Union All 
    Select DateAdd(month, 1, mon) from Months 
    Where mon < getdate()) 
Select DATENAME(MONTH, m.mon) 'Month', 
    COUNT(LateStatus) 'Count', 'Late' 'Type' 
FROM months m 
    left join Attendance1 a 
     on a.Date between m.mon and dateadd(month, 1, m.mon) 
      and a.EnrollId = '10000' 
      and a.LateStatus = 'L' 
GROUP BY DATENAME(MONTH, m.Mon) 

より一般的な機能を

create function dbo.NumberList (@start integer, @end integer) 
returns table 
as Return 
(
    With ints(aInt) As  
     (Select @start Union All 
     Select aInt + 1 From ints 
     Where aInt < @end) 
    Select aInt from ints 
) 

この関数が作成されていたら、動的に任意の型の値の任意の範囲を作成するために使用することができます:

8か月前から3か月前まで

Select i.aInt, Dateadd(month, i.aInt, 
     DateAdd(month, datediff(month(0, getdate()), 0)) 
From dbo.NumberList(-8, -3) i 
+0

ありがとう@チャールズ=ブレタナ、私が探しているもの、Works Perfectly。 –

+0

私は同じように3月から9月にも見せたいですか? –

+0

'365'の値を変更して、どこまで行くかを制御し(daterangeの始め)、 'mon

0

のデータをすべての月に仮定すると、条件付き集約を使用してこれを行うことができます。つまり、CASEを使用してSELECTからWHERE条件を移動します

SELECT DATENAME(MONTH,A.Date) as Mon, 
     SUM(CASE WHEN A.EnrollId = '10000' AND LateStatus = 'L' 
       THEN 1 ELSE 0 
      END) as cnt, 
     'Late' as 'Type' 
FROM Attendance1 A 
WHERE AND A.Date BETWEEN '2016-01-01' AND '2016-08-31' 
GROUP BY DATENAME(MONTH, A.Date) 
ORDER BY MIN(A.Date); 

は通常LEFT JOINを含む、他の方法があります。しかし、これが問題を解決すれば、これは最も簡単です。

+0

Not Working、Syntax Error –

関連する問題