有没有办法按月分组?

时间:2016-05-26 16:24:48

标签: sql sql-server datediff

我有数据需要查询,以找出哪个人在9个月内花费最多。我的数据跨越5年,9个月的时间可能包括从一年到下一年的月份。

例如2005年10月至2006年7月。

我设法按人格和月份和年份进行分组,但有没有办法让我按照9个月的时间分组?我想如果我能做到那么我就可以找到该分组中的最大值。

1 个答案:

答案 0 :(得分:1)

借助日期表或在我的情况下使用udf

Select DateR1,DateR1,PersonID,TotalSpent=sum(Spent)
 From  [SomeTable] A
 Join (
        Select DateR1=DateAdd(MM,-9,RetVal)
              ,DateR2=DateAdd(DD,-1,RetVal)
         from [dbo].[udf-Create-Range-Date]('2005-10-01','2016-07-31','MM',1)
      ) B on A.DataDate between B.DateR1 and B.DateR2
 Group By DateR1,DateR2,PersonID 
 Order by 1,3

子查询返回

DateR1      DateR2
2005-01-01  2005-09-30
2005-02-01  2005-10-31
2005-03-01  2005-11-30
2005-04-01  2005-12-31
2005-05-01  2006-01-31
2005-06-01  2006-02-28
...
2015-09-01  2016-05-31
2015-10-01  2016-06-30
2015-11-01  2016-07-31

因此,在日期范围之间聚合数据只是一个小问题

这是一个滚动的9个月

如果不滚动

Select DateR1,DateR2=DateAdd(DD,-1,DateR2) from [dbo].[udf-Create-Range-Date-Span]('2005-10-01','2016-07-31','MM',9)

返回

DateR1      DateR2
2005-10-01  2006-06-30
2006-07-01  2007-03-31
2007-04-01  2007-12-31
2008-01-01  2008-09-30
2008-10-01  2009-06-30
2009-07-01  2010-03-31
2010-04-01  2010-12-31
2011-01-01  2011-09-30
2011-10-01  2012-06-30
2012-07-01  2013-03-31
2013-04-01  2013-12-31
2014-01-01  2014-09-30
2014-10-01  2015-06-30
2015-07-01  2016-03-31
2016-04-01  2016-07-30