sql-server – 按日期范围内的频率划分的SQL组

前端之家收集整理的这篇文章主要介绍了sql-server – 按日期范围内的频率划分的SQL组前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要编写一个接受开始日期,结束日期和频率(日,周,月,季,年)的存储过程,并根据这些参数输出结果集.显然,简单的部分是按日期范围查询,但是如何按频率分组?

所以,如果有一组这样的原始数据:

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.

猜你在找的MsSQL相关文章