问:TSQL - 在数据中添加缺失的年月差距?

我有一个要求填写数据中缺失的时间间隔,并填充Cnt列为0的任何间隙。我需要为此使用日历表吗?问: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

回答:

另一种选择是一个特设的理货表

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

回答:

你可以有一个永久的日历表,或者你可以逃脱正常的Numbers表格。无论哪种方式,建立一个递归cte是更可取的解决方案。但是,如果是一次性的报告,您可以轻松地摆脱简单的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和数量今年作为参数

以上是 问:TSQL - 在数据中添加缺失的年月差距? 的全部内容, 来源链接: utcz.com/qa/259349.html

回到顶部