我正在创建一个存储过程,该过程将返回有关Product及其用法的数据。
No Product Usage (Jan 2017) Usage (Feb 2017)
=====================================================
1 Paper 0.00 0.00
2 Ink 0.00 0.00
我所做的是在查询之下(较长查询的一部分)
DECLARE
@StartPeriod DATETIME = N'01/01/2017 00:00:00',
@EndPeriod DATETIME = N'12/30/2018 00:00:00'
DECLARE @query VARCHAR(MAX),
@StartMonth int = MONTH(@StartPeriod),
@EndMonth int = MONTH(@EndPeriod),
@StartYear int = YEAR(@StartPeriod),
@EndYear int = YEAR(@EndPeriod),
@Period datetime = @StartPeriod
while (@StartYear < @EndYear OR (@StartYear = @EndYear AND @StartMonth <= @EndMonth))
begin
set @query = @query + '
case when (
select Consumption
from tbl_Consumption c
where c.ProductID = a.ProductID
and DATEPART(YEAR, StartPeriod) = DATEPART(YEAR, ''' + CONVERT(VARCHAR, @Period) + ''')
and DATEPART(MONTH, StartPeriod) = DATEPART(MONTH, ''' + CONVERT(VARCHAR, @Period) + ''')
) is null then 0.00
else (
select Consumption
from tbl_Consumption c
where c.ProductID = a.ProductID
and DATEPART(YEAR, StartPeriod) = DATEPART(YEAR, ''' + CONVERT(VARCHAR, @Period) + ''')
and DATEPART(MONTH, StartPeriod) = DATEPART(MONTH, ''' + CONVERT(VARCHAR, @Period) + ''')
)
end as [Usage (' + LEFT(DateName(month, DateAdd(month, @Period, -1)),3) + ' ' + CONVERT(VARCHAR, @Period) +')],'
set @Period = DATEADD(MONTH, 1, @Period)
set @StartMonth = @StartMonth + 1
if @StartMonth > 12
begin
set @StartYear = @StartYear + 1
end
end
问题是当参数StartPeriod中的年份小于EndPeriod时,它仅返回2017年的月份数据。 例如,上面的代码仅返回2017年1月至12月的数据,但它也应该返回2018年1月到12月的数据。 我正在使用SQL Server 2014。
请帮忙。非常感谢你。
答案 0 :(得分:1)
在您的逻辑中,您必须在@StartMonth
January
重置为@StartMonth > 12
if @StartMonth > 12
begin
set @StartYear = @StartYear + 1
set @StartMonth = 1 --reset the month to Jan
end
注意: - 但是这种动态的sql方法不太好,您可以使用交叉制表符/矩阵报表在报表中显示此类数据或类似PIVOT
来查询本身。