【问题标题】:group and sum by a custom data range按自定义数据范围分组和求和
【发布时间】:2015-05-21 14:10:44
【问题描述】:

我想按自定义的每周日期范围对 amount 列进行分组,即每周一到周日。

我的数据是这样的

date              weekday         amount
---------------|--------------|---------------
2015-03-01        sun              40
2015-03-02        mon              670
2015-03-03        tue              430
2015-03-04        wed              70
2015-03-05        thu              220
2015-03-06        fri              7
2015-03-07        sat              780
2015-03-08        sun              43
2015-03-09        mon              10
2015-03-10        tue              200
2015-03-11        wed              30
2015-03-12        thu              40
2015-03-13        fri              500
2015-03-14        sat              80
2015-03-15        sun              20
2015-03-16        mon              30
2015-03-17        tue              90
2015-03-18        wed              50
2015-03-19        thu              50
2015-03-20        fri              60
2015-03-21        sat              810
2015-03-22        sun              30
2015-03-23        mon              50

等等,

等等,

我想实现这样的目标

amount         week
-----------|--------------------------------|---
2200        2015-03-02 - 2015-03-08
910         2015-03-09 - 2015-03-15
1120        2015-03-16 - 2015-03-22

或者,如果可能的话,这会更好(如果没有,那么我将把上面的例子正则表达式到新的列中)

amount         date_start         date_end
-----------|------------------|----------------|---
2200           2015-03-02         2015-03-08
910            2015-03-09         2015-03-15
1120           2015-03-16         2015-03-22

【问题讨论】:

  • 这是从应用程序运行还是直接从 sql 运行?
  • 您实际上并没有存储工作日,是吗?
  • 它在 mysql 上运行。不,我不存储工作日,这只是为了说明我需要按自定义工作日/范围进行分组
  • 我将把它留在这里 @user3768071 这适用于你的第一周,挑战是让它在所有周内都能正常工作 sqlfiddle.com/#!9/1742b/9,我得赶火车,所以没有更多了时间

标签: mysql date group-by


【解决方案1】:

想要的结果不是如下吗?如果没有,为什么不……

+------------+--------+
| date       | amount |
+------------+--------+
| 2015-03-01 |     40 |40
+------------+--------+
| 2015-03-02 |    670 |
| 2015-03-03 |    430 |
| 2015-03-04 |     70 |
| 2015-03-05 |    220 |
| 2015-03-06 |      7 |
| 2015-03-07 |    780 |
| 2015-03-08 |     43 |2220
+------------+--------+
| 2015-03-09 |     10 |
| 2015-03-10 |    200 |
| 2015-03-11 |     30 |
| 2015-03-12 |     40 |
| 2015-03-13 |    500 |
| 2015-03-14 |     80 |
| 2015-03-15 |     20 |880
+------------+--------+
| 2015-03-16 |     30 |
| 2015-03-17 |     90 |
| 2015-03-18 |     50 |
| 2015-03-19 |     50 |
| 2015-03-20 |     60 |
| 2015-03-21 |    810 |
| 2015-03-22 |     30 |1120
+------------+--------+
| 2015-03-23 |     50 |50
+------------+--------+

假设我是对的,那么:

SELECT MIN(date) start
     , MAX(date) end
     , SUM(amount) total 
  FROM my_table 
 GROUP 
    BY YEARWEEK(date,1);
+------------+------------+-------+
| start      | end        | total |
+------------+------------+-------+
| 2015-03-01 | 2015-03-01 |    40 |
| 2015-03-02 | 2015-03-08 |  2220 |
| 2015-03-09 | 2015-03-15 |   880 |
| 2015-03-16 | 2015-03-22 |  1120 |
| 2015-03-23 | 2015-03-23 |    50 |
+------------+------------+-------+

【讨论】:

  • 在这种情况下,您需要使用宇宙中普遍存在的任何算术逻辑。
  • 有点工作,如果我包括这个,效果很好... WHERE date > '2015-03-02' ...但实际上我的日期是从 2014 年 1 月到 2015 年当前日期,并且没有where 子句的日期搞砸了,例如,2014-01-01 - 2015-01-04、2014-01-06 - 2015-01-11 等。
  • 对不起草莓,不确定我是否在你回答之前发布了,反之亦然。这个网站在刷新回复时很奇怪。你说的地方......假设我是对的,那么:......有点工作,如果我包括这个...... WHERE date > '2015-03-02'......但我的日期真的来自2014 年 1 月到 2015 年当前日期,如果没有 where 子句,日期就会搞砸,例如 2014-01-01 - 2015-01-04、2014-01-06 - 2015-01-11 等。
  • 见上面的编辑。但请注意,YEARWEEK 的行为与 WEEK 略有不同,因此您可能需要稍微调整一下。
  • 可爱的少年!印象深刻并感谢您的帮助。草莓干杯!
【解决方案2】:

您可以尝试以下查询:-

SELECT SUM(amount) AS total, CONCAT(date, ' - ', date + INTERVAL 6 DAY) AS week 
FROM Your_Table 
GROUP BY WEEK(date, 1) 
ORDER BY WEEK(date, 1)

【讨论】:

  • 已经尝试过了,但似乎按默认周分组,没有规定从周一到周日指定我的自定义周
  • 可爱的少年!印象深刻并感谢您的帮助。草莓干杯!
猜你喜欢
  • 2015-02-26
  • 2021-11-26
  • 2018-03-13
  • 1970-01-01
  • 2020-04-29
  • 2015-01-22
  • 2013-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多