MySQL GROUP BY WEEK从月初开始

时间:2016-10-18 08:53:10

标签: mysql group-by

需要按周组合从当月的第1天开始

的DDL:

CREATE TABLE `group_by_week` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `date` date DEFAULT NULL,
  `value` int(4) DEFAULT NULL,
  PRIMARY KEY (`id`)
);

INSERT INTO `group_by_week`
(`date`,`value`)
VALUES
('2016-01-01',1),
('2016-01-02',2),
('2016-01-03',3),
('2016-01-04',4),
('2016-01-05',5),
('2016-01-06',6),
('2016-01-07',7),
('2016-01-08',8),
('2016-01-09',9),
('2016-01-10',10),
('2016-01-11',11),
('2016-01-12',12),
('2016-01-13',13),
('2016-01-14',14),
('2016-01-15',15),
('2016-01-16',16);

预期结果:

第1周=> 28

第2周=> 77

第3周=> 31

2 个答案:

答案 0 :(得分:0)

E.g:

SELECT CEILING(DATE_FORMAT(date,'%d')/7) w
     , SUM(value) week_total 
  FROM group_by_week 
 GROUP 
    BY w;

显然,如果处理超过一个月,你需要稍微扩展逻辑,但我会将其作为读者的练习。

另请注意' 4'在' INT(4)'这是毫无意义的 - 我非常怀疑它会做任何你认为的事情。

答案 1 :(得分:0)

您可能需要通过将Day部分用7潜水来获取周数,然后您可能需要使用FLOOR对结果进行舍入。

如果有不同月份的日期,那么最好添加month name以及周数。所以我就这样做了。所以第一列值就像monthname weeknumber。我们可以group by使用相同的第一列。

<强>查询

SELECT
  CONCAT(MONTHNAME(`date`), ' week ', FLOOR(((DAY(`date`) - 1) / 7) + 1)) `month & week`, 
  SUM(`value`) AS `value`
FROM `group_by_week`
GROUP BY `month & week`
ORDER BY month(`date`), `month & week`;

<强>结果

+-----------------+-------+
| month & week    | value |
+-----------------+-------+
| January week 1  |  28   |
| January week 2  |  77   |
| January week 3  |  31   |
+-----------------+-------+

SQL Fiddle Demo