【发布时间】: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