在 PostgreSQL 中,ROLLUP 和窗口函數可以結合使用,以便在一個查詢中執行分組和匯總操作
首先,我們需要創建一個示例表:
CREATE TABLE sales (
id SERIAL PRIMARY KEY,
product_id INT,
store_id INT,
amount NUMERIC(10, 2),
sale_date DATE
);
接下來,我們將插入一些示例數據:
INSERT INTO sales (product_id, store_id, amount, sale_date)
VALUES (1, 1, 100.00, '2021-01-01'),
(1, 1, 200.00, '2021-01-02'),
(1, 2, 300.00, '2021-01-01'),
(2, 1, 400.00, '2021-01-01'),
(2, 2, 500.00, '2021-01-01');
現在,我們將使用 ROLLUP 和窗口函數計算每個商店的銷售總額以及總銷售總額。這是一個示例查詢:
SELECT store_id, SUM(amount) AS total_sales,
SUM(SUM(amount)) OVER () AS grand_total_sales
FROM sales
GROUP BY ROLLUP (store_id)
ORDER BY store_id;
這個查詢將返回以下結果:
store_id | total_sales | grand_total_sales
----------+-------------+-------------------
1 | 700.00| 1900.00
2 | 800.00| 1900.00
NULL | 1900.00| 1900.00
在這個查詢中,我們首先使用 GROUP BY ROLLUP (store_id)
對商店進行分組。然后,我們使用 SUM(amount)
計算每個商店的銷售總額。最后,我們使用窗口函數 SUM(SUM(amount)) OVER ()
計算所有商店的總銷售總額。注意,當 store_id
為 NULL 時,表示這是一個匯總行,包含所有商店的總銷售總額。