0

这真的难倒我,但也许答案只是隐藏在显而易见的地方,我看不到讨厌的虫子。但话又说回来,我不是 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
4

1 回答 1

0

就像是; 编辑以反映使用每个月的第一个日期的要求:

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)
于 2013-07-11T15:14:50.520 回答