我有一个每月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
,以便我可以推送付款日期和其他过滤条件。值得一提的是,我们可以跨越多年。
答案 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
| 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')