【问题标题】:T-SQL to return data in different yearsT-SQL 返回不同年份的数据
【发布时间】:2018-01-12 08:34:13
【问题描述】:

我正在创建一个存储过程,它将返回有关产品及其使用情况的数据。

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 月到 2017 年 12 月的数据,但它也应该返回 2018 年 1 月到 2018 年 12 月的数据。 我正在使用 SQL Server 2014。

请帮忙。非常感谢。

【问题讨论】:

    标签: sql-server tsql


    【解决方案1】:

    在您的逻辑中,当@StartMonth &gt; 12 时,您必须将@StartMonth 重置为January

    if @StartMonth > 12
    begin
        set @StartYear = @StartYear + 1
        set @StartMonth = 1 --reset the month to Jan
    end
    

    注意 :- 但是这种动态 sql 方法不是很好,您可以使用交叉表/矩阵报表在报表中显示此类数据,或者使用类似 PIVOT 的方式进入查询本身。

    【讨论】:

    • 这样一个初学者的错误 :) 谢谢,它有效 :D 谢谢你的建议,我会找一些参考资料。
    猜你喜欢
    • 2020-06-11
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 2019-10-25
    • 2010-12-22
    • 1970-01-01
    相关资源
    最近更新 更多