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开始:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- sql-server – SQL Server Passthrough查询作为Access中DAO
- EXEC(EXECUTE)函数访问INSERTED或DELETED的内部临时触发表
- VMM系列之使用VMM服务器部署MSSQLServer
- SQLServer2008R2下载地址
- SQLServer下的用户自定义函数的语法格式、编写实例以及调用
- sql-server – T-SQL相当于Oracle的%TYPE运算符?
- Sqlserver实现故障转移 — sqlserver镜像备份实现故障转移(
- SQLServer2005 中的几个统计技巧
- SqlServer提示“列前缀tempdb.无效: 未指定表名”问题解决方
- sql – 查询子串形成