在 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 时,表示这是一个汇总行,包含所有商店的总销售总额。