Chúng cho phép tính nhiều mức tổng hợp trong một lần quét bảng, thay vì viết nhiều GROUP BY rồi UNION ALL.
GROUPING SETS ((a,b), (a), ())— liệt kê tường minh các tổ hợp cần gom.ROLLUP(a, b)— tổng theo cấp bậc:(a,b),(a),(). Hợp với phân cấp năm → tháng, vùng → tỉnh.CUBE(a, b)— mọi tổ hợp:(a,b),(a),(b),().
sql
SELECT region, product, SUM(amount) AS total
FROM sales
GROUP BY ROLLUP (region, product);
-- cho ra: tong moi (region, product)
-- tong theo region (product = NULL)
-- tong toan bo (ca hai NULL)Vấn đề thực tế: dòng tổng có NULL ở cột đã gộp, lẫn với NULL của dữ liệu thật.
Dùng hàm GROUPING() để phân biệt:
sql
SELECT
CASE WHEN GROUPING(region) = 1 THEN 'ALL REGIONS' ELSE region END AS region,
SUM(amount)
FROM sales
GROUP BY ROLLUP (region);Lợi ích so với UNION ALL: chỉ quét bảng một lần thay vì N lần, và kế hoạch thực thi gọn hơn.
PostgreSQL hỗ trợ từ 9.5; MySQL 8.0 có WITH ROLLUP (chỉ ROLLUP, không có CUBE) và hàm GROUPING().