T-SQL在不同年份返回数据

时间:2018-01-12 08:34:13

标签: sql-server tsql

我正在创建一个存储过程,该过程将返回有关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。

请帮忙。非常感谢你。

1 个答案:

答案 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来查询本身。