2

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

4

3 回答 3

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 |
于 2013-05-31T06:51:13.943 回答
1

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

select date_format(date - 14, '%Y-%m'), sum(sent)
from counter
group by date_format(date - 14, '%Y-%m')
于 2013-05-31T07:01:15.837 回答
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)   

小心,因为字段的名称“日期”包含在 ANSISQL 中的关键字“日期”

于 2013-05-31T06:51:33.587 回答