2016-10-18 3 views
0

Потребность GROUP BY НЕДЕЛИ Начиная с 1-го числа текущего месяцаMySQL GROUP BY WEEK Начиная первого месяца

DDLS:

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

ответ

0

т.д .:

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

Очевидно, что вам нужно расширить логику немного, если дело с более чем за один месяц, но я оставлю это в качестве упражнения для читателя.

Обратите внимание также, что «4» в «INT (4)» довольно бессмысленна - я очень сомневаюсь, что он делает все, что вы думаете.

+0

Спасибо. Позвольте мне попытаться реализовать это в моей рабочей таблице –

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

+0

Спасибо. Позвольте мне попытаться реализовать это в моей рабочей таблице –