这真的让我感到难过,但也许答案只是躲在明显的视线中,我看不到讨厌的虫子。但话说回来,我不是DBA,我正在努力学习如何编写更复杂的SQL,这些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
答案 0 :(得分: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)