所以,如果有一组这样的原始数据:
Date Count --------------------- 11/15/2011 6 12/16/2011 9 12/17/2011 2 12/18/2011 1 12/18/2011 4
我将这样的存储过程称为:
sp_Report’1 / 1/2011′,’12/31/2011′,’周’
我希望这样的结果:
WeekOf Count --------------------- 11/19/2011 6 12/17/2011 11 12/24/2011 5
这里有几个问题:
1)如何确定一周结束的日期(周日结束的一周)?
2)如何按WeekOf日期范围进行分组?
解决方法
这也决定了寻找分组价值的方法.基本上,您可以看到三种不同的模式:一种用于“日”频率,另一种用于“周”,而另一种用于所有其他频率类型.
第一个是最简单的:PeriodStart和PeriodEnd都只是Date.
几个星期以来,我正在使用一个众所周知的技巧,即通过从给定日期减去一个比其工作日数少一个值的值来推导一周的第一天.本周末也是类似的:我们只是在同一个表达式中添加了6个.
月,季度和年份按以下方式分组.零日期和给定日期之间的相应单位的整数数量被添加回零日期.这给了我们这个时期的开始.结果非常相似,只有我们添加的数字大于差异.这会产生下一个时期的开始,所以我们然后减去一天,这给了我们正确的结束日期.
SELECT PeriodStart,PeriodEnd,Count = SUM(Count) FROM ( SELECT PeriodStart = CASE @Frequency WHEN 'day' THEN Date WHEN 'week' THEN DATEADD(DAY,1 - DATEPART(WEEKDAY,Date),Date) WHEN 'month' THEN DATEADD(MONTH,DATEDIFF(MONTH,0) WHEN 'quarter' THEN DATEADD(QUARTER,DATEDIFF(QUARTER,0) WHEN 'year' THEN DATEADD(YEAR,DATEDIFF(YEAR,0) END,PeriodEnd = CASE @Frequency WHEN 'day' THEN Date WHEN 'week' THEN DATEADD(DAY,7 - DATEPART(WEEKDAY,Date) WHEN 'month' THEN DATEADD(DAY,-1,DATEADD(MONTH,Date) + 1,0)) WHEN 'quarter' THEN DATEADD(DAY,DATEADD(QUARTER,0)) WHEN 'year' THEN DATEADD(DAY,DATEADD(YEAR,0)) END,Count FROM atable WHERE Date BETWEEN @DateStart AND @DateEnd ) s GROUP BY PeriodStart,PeriodEnd
> EXEC spReport’1 / 1/2011′,’12 / 31/2011′,’day’:
PeriodStart PeriodEnd Count ----------- ---------- ----- 2011-11-15 2011-11-15 6 2011-12-16 2011-12-16 9 2011-12-17 2011-12-17 2 2011-12-18 2011-12-18 5
> EXEC spReport’1 / 1/2011′,’周’:
PeriodStart PeriodEnd Count ----------- ---------- ----- 2011-11-13 2011-11-19 6 2011-12-11 2011-12-17 11 2011-12-18 2011-12-24 5
> EXEC spReport’1 / 1/2011′,’月’:
PeriodStart PeriodEnd Count ----------- ---------- ----- 2011-11-01 2011-11-30 6 2011-12-01 2011-12-31 16
> EXEC spReport’1 / 1/2011′,’quarter’:
PeriodStart PeriodEnd Count ----------- ---------- ----- 2011-10-01 2011-12-31 22
> EXEC spReport’1 / 1/2011′,’年’:
PeriodStart PeriodEnd Count ----------- ---------- ----- 2011-01-01 2011-12-31 22
注意:从MSDN开始:
Avoid the use of the sp_ prefix when naming procedures. This prefix is used by sql Server to designate system procedures. Using the prefix can cause application code to break if there is a system procedure with the same name. For more information,see 07001.