每10天按日期分组

时间:2016-11-14 10:02:57

标签: mysql sql date group-by

我有这个计划:

public static void main(String[] args) {
    String [] arr = {"x","y","z"};        
    String s  = String.join("','", arr);
    s = "('"+s+"')";
    System.out.print(s);
}

我如何获得每10天分组的总金额,例如从每月的第一天到第10天,从第11天到第20天以及从第21天到月底?

显示如下:

+----+--+--------+--------------------+
| ID |   Amount  |      paydate       |
+----+-----------+--------------------+
|  1 |    200    |2016-11-05          |
+----+-----------+--------------------+ 
|  2 |    3000   |2016-11-10          |
+----+-----------+--------------------+ 
|  3 |   2500    |2016-11-11          |
+----+-----------+--------------------+ 
| ID |   100     |2016-11-21          |
+----+-----------+--------------------+
|  1 |    200    |2016-11-22          |
+----+-----------+--------------------+ 
|  2 |    3000   |2016-11-23          |
+----+-----------+--------------------+ 
|  3 |   2500    |2016-11-29          |
+----+-----------+--------------------+ 

我试过

+-----------+------------------------+
|   Amount  |      paydate           |
+-----------+------------------------+ 
|    3200   |2016-11-1 to 2016-11-10 |
+-----------+------------------------+ 
|    2500   |2016-11-11 to 2016-11-20|
+-----------+------------------------+ 
|   5800    |2016-11-21 to 2016-11-31|     
+-----------+------------------------+

但这并没有给我我需要的结果。

2 个答案:

答案 0 :(得分:2)

select      sum(Amount) as sum_amount
           ,case 
                when day(paydate) <= 10 then concat(DATE_FORMAT(paydate,'%Y-%m-01'),' to ',DATE_FORMAT(paydate,'%Y-%m-10'))
                when day(paydate) <= 20 then concat(DATE_FORMAT(paydate,'%Y-%m-11'),' to ',DATE_FORMAT(paydate,'%Y-%m-20'))
                else concat(DATE_FORMAT(paydate,'%Y-%m-21'),' to ',DATE_FORMAT(paydate,'%Y-%m-31'))
            end as paydate_period

from        t

group by    paydate_period
;
sum_amount  paydate_period
3200        2016-11-01 to 2016-11-10
2500        2016-11-11 to 2016-11-20
5800        2016-11-21 to 2016-11-31

答案 1 :(得分:1)

以下是一个示例查询:

select 
case 
    when day(date_field) between 1 and 10 then "01 to 10"
    when day(date_field) between 11 and 20 then "11 to 20"
    when day(date_field) between 21 and 31 then "21 to 31"
end as the_range,
date_format(date_field, "%m%Y") as the_month,
count(*) 
from 
the_table
group by 
the_range, the_month
order by
the_month, the_range;

您可以调整查询,以便以您需要的方式显示结果。