Есть таблица
show create table archive_day;
+-------------+-------------------
| Table | Create Table
+-------------+-------------------
| archive_day | CREATE TABLE `archive_day` (
`user_id` int(11) NOT NULL,
`archive_date` date NOT NULL,
`user_data` double(10,3) DEFAULT NULL,
PRIMARY KEY (`user_id`,`archive_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
Из этой таблицы необходимо выбрать сумму данных с группировкой по месяцам
SELECT
SUM(`user_data`) AS `udata`,
DATE_FORMAT(`archive_date`, '%Y-%m') AS `archive_date_analyse`
FROM `archive_day`
WHERE
(`user_id` = '1')
AND
(`archive_date` >= '2013-01-01')
AND
(`archive_date` <= '2013-04-30')
GROUP BY
`archive_date_analyse`
ORDER BY
`archive_date_analyse` ASC
Получаем так
+--------+----------------------+
| udata | archive_date_analyse |
+--------+----------------------+
| 79.671 | 2013-01 |
| 62.574 | 2013-02 |
| 52.220 | 2013-03 |
| 14.120 | 2013-04 |
+--------+----------------------+
Теперь «концепция поменялась» и дополнительно надо, чтобы группировка была с 21 по 20 число месяца. Такие периоды
2013-01-01 — 2013-01-20
2013-01-21 — 2013-02-20
2013-02-21 — 2013-03-20
2013-03-21 — 2013-04-20
2013-04-21 — 2013-04-30
Первый и последний периоды ограничатся условия в where.
Возможно ли сделать такую группировку средствами sql? Или проще выбрать все данные, а потом уже их обработать как надо?