2017-03-08 6 views
0

データの欠落した時間ギャップを埋める必要があり、ギャップのいずれかに対してCnt列に0を設定する必要があります。このためにカレンダーテーブルを使用する必要がありますか?Q:TSQL - データに年月不足のギャップを追加しますか?

私のクエリの結果は既に集計されています。ギャップを追加するだけです。

select name 
     ,YR 
     ,MO 
     ,[Cnt] 
from dbo.OON 

電流出力:

Name | YR | MO | Cnt 
Kelly | 2014 | 1 | 197 
Kelly | 2014 | 3 | 200 
Kelly | 2014 | 5 | 300 
Kelly | 2015 | 2 | 100 
Kelly | 2015 | 3 | 50 
Kelly | 2015 | 6 | 70 

所望の出力:

Name | YR | MO | Cnt 
Kelly | 2014 | 1 | 197 
Kelly | 2014 | 2 | 0 
Kelly | 2014 | 3 | 200 
Kelly | 2014 | 4 | 0 
Kelly | 2014 | 5 | 300 
Kelly | 2014 | 6 | 0 
Kelly | 2014 | 7 | 0 
Kelly | 2014 | 8 | 0 
Kelly | 2014 | 9 | 0 
Kelly | 2014 | 10 | 0 
Kelly | 2014 | 11 | 0 
Kelly | 2014 | 12 | 0 
Kelly | 2015 | 1 | 0 
Kelly | 2015 | 2 | 100 
Kelly | 2015 | 3 | 50 
Kelly | 2015 | 4 | 0 
Kelly | 2015 | 5 | 0 
Kelly | 2015 | 6 | 70 
Kelly | 2015 | 7 | 0 
Kelly | 2015 | 8 | 0 
Kelly | 2015 | 9 | 0 
Kelly | 2015 | 10 | 0 
Kelly | 2015 | 11 | 0 
Kelly | 2015 | 12 | 0 
+1

ええ、私は通常、カレンダーテーブルでこれを行います。クエリ時に再帰的に生成することもできますが、永続的なものを作成してデータウェアハウスに格納することをお勧めします。これを視覚化する場合は、Power BIを使用することをお勧めします.CALENDARAUTO()を使用してDAXでカレンダーを生成できます。 – smj

+0

ここには良い記事があります:https://www.mssqltips.com/sqlservertip/4054/creating-a-date-dimension-or-calendar-table-in-sql-server/ – smj

答えて

2

別のオプションをパラメータとして今年のアドホック集計テーブルである

Declare @OON table (Name varchar(25),YR int,MO int,Cnt int) 
Insert Into @OON values 
('Kelly' , 2014 , 1 , 197), 
('Kelly' , 2014 , 3 , 200), 
('Kelly' , 2014 , 5 , 300), 
('Kelly' , 2015 , 2 , 100), 
('Kelly' , 2015 , 3 , 50), 
('Kelly' , 2015 , 6 , 70) 

Declare @PerBeg date = '2014-01-01' 
Declare @Months int = 24 

Select B.Name 
     ,Yr=Year(A.D) 
     ,MO=Month(A.D) 
     ,Cnt=IsNull(C.Cnt,0) 
From (Select Top (@Months) D=DateAdd(MM,-1+Row_Number() Over (Order By (Select null)),@PerBeg) From master..spt_values) A 
Cross Join (Select Distinct Name from @OON) B 
Left Join @OON C on B.Name=C.Name and Year(A.D)=C.Yr and Month(A.D)=C.MO 

戻り

Name Yr  MO Cnt 
Kelly 2014 1 197 
Kelly 2014 2 0 
Kelly 2014 3 200 
Kelly 2014 4 0 
Kelly 2014 5 300 
Kelly 2014 6 0 
Kelly 2014 7 0 
Kelly 2014 8 0 
Kelly 2014 9 0 
Kelly 2014 10 0 
Kelly 2014 11 0 
Kelly 2014 12 0 
Kelly 2015 1 0 
Kelly 2015 2 100 
Kelly 2015 3 50 
Kelly 2015 4 0 
Kelly 2015 5 0 
Kelly 2015 6 70 
Kelly 2015 7 0 
Kelly 2015 8 0 
Kelly 2015 9 0 
Kelly 2015 10 0 
Kelly 2015 11 0 
Kelly 2015 12 0 
0

あなたは永久カレンダーのテーブルを持つことができ、またはあなたは、通常の数値テーブルで逃げることができます。いずれにしても、再帰的なcteを構築することがより好ましい解決策です。それは1オフになっている場合しかし、あなたは簡単に以下のようにあたり、シンプルなCTEで逃げることができレポート:あなた上記のクエリで

;with n as (
    select 1 as n 
    UNION ALL 
    SELECT n + 1 FROM n WHERE n < 20), 
years as (
    select 2013 + n.n as [year] from n where n < 3), 
months as (
    select 0 + n.n as [month] from n where n < 13) 
select r.name, years.[year], months.[month], coalesce(r.Cnt,0) 
from years cross join months 
left join dbo.OON r on years.[year] = r.[YR] and months.[month] = r.[MO] 
order by 1,2,3 

years CTEと番号の初期値を使用することをお勧めします

+0

再帰的なCTEのパフォーマンスははるかに低くなりますJohnが上で投稿した集計表のソリューションよりも優れています。この優秀な記事に注目してください:http://www.sqlservercentral.com/articles/T-SQL/74118/ –

関連する問題