根据每月的某一天对数据进行分组和汇总

时间:2013-05-31 06:18:12

标签: mysql group-by

我有一个每月14th的重复付款日,并希望按月/年对数据子集进行分组,并对发送的列进行求和。例如,对于给定的数据: -

Table `Counter`
Id   Date         Sent 
1    10/04/2013     2      
2    11/04/2013     4      
3    15/04/2013     7 
4    10/05/2013     3      
5    14/05/2013     5      
6    15/05/2013     3 
7    16/05/2013     4 

我想要的输出是这样的:

From         Count
14/03/2013    6
14/04/2013    10
14/05/2013    12

我不担心如何格式化from列,或者它是否更容易拆分为月/年,因为我可以从GUI中的多个列重新创建日期。所以输出很容易就是:

FromMth   FromYr         Count
03         2013           6
04         2013          10
05         2013          12

甚至

toMth       toYr         Count
04         2013           6
05         2013          10
06         2013          12

如果付款日期是例如31st,则日期比较需要是每个月的最后日期。我也不担心在结果集中错过几个月。

我还会将其转换为Stored procedure,以便我可以推送付款日期和其他过滤条件。值得一提的是,我们可以跨越多年。

3 个答案:

答案 0 :(得分:2)

尝试此查询

select  
if(day(STR_TO_DATE(date, "%Y-%d-%m")) >= 14, 
   concat('14/', month(STR_TO_DATE(date, "%Y-%d-%m")), '/', year(STR_TO_DATE(date, "%Y-%d-%m"))) , 
   concat('14/', if ((month(STR_TO_DATE(date, "%Y-%d-%m")) - 1) = 0, 
                     concat('12/', year(STR_TO_DATE(date, "%Y-%d-%m")) - 1),
                     concat(month(STR_TO_DATE(date, "%Y-%d-%m"))-1,'/',year(STR_TO_DATE(date, "%Y-%d-%m")))
                    )
         )

  ) as fromDate, 
sum(sent)
from tbl
group by  fromDate

FIDDLE

|   FROMDATE | SUM(SENT) |
--------------------------
| 14/10/2013 |         3 |
| 14/12/2012 |         1 |
|  14/3/2013 |         6 |
|  14/4/2013 |        10 |
|  14/5/2013 |        12 |
|  14/9/2013 |         1 |

答案 1 :(得分:1)

支付日期可以分别按月和年分组

    select Sum(Sent) as "Count",
           Extract(Month from Date - 13) as FromMth,
           Extract(Year from Date - 13) as FromYr
      from Counter
  group by Extract(Year from Date - 13),
           Extract(Month from Date - 13)   

要小心,因为字段名称“Date”与ANSISQL中的关键字“date”相关

答案 2 :(得分:1)

我认为做你想做的最简单的方法是在那个月减去日期和小组的14天:

select date_format(date - 14, '%Y-%m'), sum(sent)
from counter
group by date_format(date - 14, '%Y-%m')