【问题标题】:Rolling data up by month per year每年按月滚动数据
【发布时间】:2013-07-11 14:57:40
【问题描述】:

这真的难倒我,但也许答案只是隐藏在视线范围内,我看不到讨厌的虫子。但话又说回来,我不是 DBA,我正在尝试学习如何编写更复杂的 SQL 来汇总数月的记录,而不是提取数千条记录。这样我就可以在后端聚合这些数据以减轻客户端的负载。

我想从数据库中选择多年的数据,并将每个月汇总到单独表中的自己的记录中。这意味着我一年中最多应该有 12 个月的 12 条记录 * 我选择的年数。

在我看来这似乎很简单,我选择了一个日期范围并按使用 DATEPART(MM, ) 的月份来区分。然后我使用简单的 COUNT()、AVG() 和 ETC 函数将这些数据汇总到 case 语句之外的月份。

但是,这并不是那么好用。那么,如何选择一系列数据,按月将多列聚合到一条记录中,并在一个 select 语句中查看多年的数据?我可以用一个选择语句来简单地总结一个月,而不是一年中的每个月 * 我想要回溯的年数。

示例

这段代码可以满足我的所有需求。只需要让它能够在一年中的每个月 * 我想申请的年数上做同样的事情。

DECLARE @StartDate Date='2013-01-01'
DECLARE @EndDate Date='2013-02-01'

SELECT @Name, 
    @StartDate, 
    COUNT(a.[CODE]),
    SUM(a.[TICKETS]),
    AVG(a.[TICKETS]),
    COUNT(CASE WHEN a.[FLAG1] = 'A' THEN 1 ELSE NULL END),
    COUNT(CASE WHEN a.[FLAG1] = 'B' THEN 1 ELSE NULL END),
    COUNT(CASE WHEN a.[FLAG1] IS NULL THEN 1 ELSE NULL END)
FROM [SOMETABLE] a
WHERE a.[CODE] = @Name
AND a.[DATE] >= @StartDate
AND a.[DATE] < @EndDate

【问题讨论】:

    标签: sql sql-server database tsql


    【解决方案1】:

    类似的东西;编辑以反映使用每个月的第一个日期的要求:

    DECLARE @StartDate Date='2013-01-01'
    DECLARE @EndDate Date='2013-02-01'
    
    SELECT @Name, 
        DATEADD(month, DATEDIFF(MONTH, 0, a.[date]),0), 
        COUNT(a.[CODE]),
        SUM(a.[TICKETS]),
        AVG(a.[TICKETS]),
        COUNT(CASE WHEN a.[FLAG1] = 'A' THEN 1 ELSE NULL END),
        COUNT(CASE WHEN a.[FLAG1] = 'B' THEN 1 ELSE NULL END),
        COUNT(CASE WHEN a.[FLAG1] IS NULL THEN 1 ELSE NULL END)
    FROM [SOMETABLE] a
    WHERE a.[CODE] = @Name
    AND a.[DATE] >= @StartDate
    AND a.[DATE] < @EndDate
    GROUP BY DATEADD(month, DATEDIFF(MONTH, 0, a.[date]),0)
    

    【讨论】:

    • 谢谢!那效果非常好。我只需要修复@StartDate,它会在该月的第一天拉动,而不是在每条记录中都添加“2013-01-01”。不过我可以处理。再次感谢您指出 GROUP BY 的明显之处。
    • 我刚刚编辑了它;如果对您有帮助,请务必将其标记为正确答案。
    • 对我来说看起来不错。现在,我只是想了解这些功能是如何以这种方式工作的。用 DATEPART 选择月份和年份的另一种方法对我来说是很容易理解的。但是,感谢您的额外帮助。现在开始喜欢玩数据了。
    • 不客气;几年前我写了一篇关于语法的博文:codegumbo.com/index.php/2009/07/24/you-can-teach-an-old-dog
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多