Поскольку GROUP BY ROLLUP
был представлен с версией 9.5 , запрос не имеет шансов работать. Но если вы думаете о том, что он делает, в вашем случае будет очень легко придумать версию с таким же результатом.
Как правило, вы хотите иметь:
- общая сумма
- сумма в год
- и сумма в месяц
- для ежедневных подсчетов
Я специально написал вышеупомянутое, чтобы стало ясно, что вам действительно нужно:
- производить ежедневные подсчеты
- генерирует сумму в месяц из ежедневных подсчетов
- генерирует сумму в год из сумм за месяц или по дням
- генерировать итоговую сумму из годовых сумм, месячных сумм или ежедневных подсчетов
UNION ALL
из вышеперечисленного в нужном вам порядке
Поскольку по умолчанию для GROUP BY ROLLUP
сначала записывается итог, а затем отдельные групповые наборы с NULLS LAST
, следующий запрос будет делать то же самое:
WITH
daily AS (
SELECT EXTRACT (YEAR FROM rental_date) y, EXTRACT (MONTH FROM rental_date) M, EXTRACT (DAY FROM rental_date) d, COUNT (rental_id) AS count
FROM rental
GROUP BY 1, 2, 3
),
monthly AS (
SELECT y, M, NULL::double precision d, SUM (count) AS count
FROM daily
GROUP BY 1, 2
),
yearly AS (
SELECT y, NULL::double precision M, NULL::double precision d, SUM (count) AS count
FROM monthly
GROUP BY 1
),
totals AS (
SELECT NULL::double precision y, NULL::double precision M, NULL::double precision d, SUM (count) AS count
FROM yearly
)
SELECT * FROM totals
UNION ALL
SELECT * FROM daily
UNION ALL
SELECT * FROM monthly
UNION ALL
SELECT * FROM yearly
;
Вышеуказанное работает с PostgreSQL 8.4 + . Если у вас даже нет этой версии, мы должны вернуться к старой школе UNION
без повторного использования данных агрегации:
SELECT NULL::double precision y, NULL::double precision M, NULL::double precision d, COUNT (rental_id) AS count
FROM rental
UNION ALL
SELECT EXTRACT (YEAR FROM rental_date) y, EXTRACT (MONTH FROM rental_date) M, EXTRACT (DAY FROM rental_date) d, COUNT (rental_id) AS count
FROM rental
GROUP BY 1, 2, 3
UNION ALL
SELECT EXTRACT (YEAR FROM rental_date) y, EXTRACT (MONTH FROM rental_date) M, NULL::double precision d, COUNT (rental_id) AS count
FROM rental
GROUP BY 1, 2
UNION ALL
SELECT EXTRACT (YEAR FROM rental_date) y, NULL::double precision M, NULL::double precision d, COUNT (rental_id) AS count
FROM rental
GROUP BY 1
;