バージョン 9.5GROUP BY ROLLUP
で導入されたように、クエリが機能する可能性はありません。しかし、それが何をするかを考えると、あなたの場合、同じ結果を生成するバージョンを思いつくのは非常に簡単なはずです.
基本的に、次のものが必要です。
- 全体の合計
- 年額
- と月額
- 毎日のカウントのために
実際に必要なものが明確になるように、上記を特別な方法で記述しました。
- 毎日のカウントを生成する
- 毎日のカウントから月ごとの合計を生成する
- 毎月の合計または毎日のカウントから年間の合計を生成する
- 年額、月額、または日額から合計を生成する
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
;