Вы можете попробовать этот динамический запрос независимо от того, какая дата в базе данных.Вы можете поместить это в sqlfiddle, чтобы протестировать его самостоятельно или db-fiddle
https://www.db -fiddle.com / f / ncES6tKJ8KsAVZjSZCkhv / 1
CREATE TABLE Bookings
(`id` int, `price` int, `date` date)
;
INSERT INTO Bookings
(`id`, `price`, `date`)
VALUES
(1, 1200, '2017-01-01'),
(2, 400, '2017-01-14'),
(3, 300, '2017-02-04'),
(4, 650, '2017-02-17'),
(5, 240, '2017-02-22'),
(6, 240, '2017-04-22'),
(7, 1240, '2017-08-25')
;
Запрос # 1
SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
Нет результатов для отображения.
Запрос # 2
SELECT DATE_FORMAT(aux.d,'%Y-%m-01') as mth, DATE_FORMAT(aux.d,'%b %Y') as mth, t.price FROM
(
SELECT CONVERT( @d := DATE_ADD(@d, INTERVAL 1 MONTH), DATE ) AS d
FROM Bookings a,
(
SELECT @d := ( SELECT DATE_SUB(MIN(DISTINCT(a.date)) , INTERVAL 1 MONTH ) FROM Bookings a )
) x
WHERE @d <= ( SELECT DATE_SUB(MAX(DISTINCT(a.date)) , INTERVAL 1 MONTH ) FROM Bookings a )
) aux
LEFT JOIN
(
SELECT DATE_FORMAT(date, '%b %Y' ) as mth2,
DATE_FORMAT(date, '%Y-%m-01' ) as mth1,
sum(price) as price
FROM Bookings
GROUP BY DATE_FORMAT(date, '%Y-%m-01')
ORDER BY mth1 ASC
) as t
ON t.mth1=aux.d
ORDER BY aux.d ASC;
| mth | price |
| -------- | ----- |
| Jan 2017 | 1600 |
| Feb 2017 | 1190 |
| Mar 2017 | |
| Apr 2017 | 240 |
| May 2017 | |
| Jun 2017 | |
| Jul 2017 | |