So sánh GROUP BY / ROLLUP / GROUPING SETS / CUBE trong SQL
Trong Microsoft SQL Server / Azure SQL / Fabric Warehouse, ba toán tử này là phần mở rộng của GROUP BY.
Mục đích của chúng: Tính tổng phụ và tổng tổng cộng trong một truy vấn duy nhất, không cần viết nhiều UNION.
Dữ liệu mẫu
| OrderYear | ProductName | Qty |
|---|---|---|
| 2023 | A | 10 |
| 2023 | B | 20 |
| 2024 | A | 15 |
| 2024 | B | 25 |
1) GROUP BY (Cơ bản chuẩn)
SELECT OrderYear, ProductName, SUM(Qty) AS TotalQty
FROM Sales
GROUP BY OrderYear, ProductName;
Kết quả:
| OrderYear | ProductName | TotalQty |
|---|---|---|
| 2023 | A | 10 |
| 2023 | B | 20 |
| 2024 | A | 15 |
| 2024 | B | 25 |
Đây là GROUP BY tiêu chuẩn không có tổng phụ.
2) ROLLUP(OrderYear, ProductName)
SELECT OrderYear, ProductName, SUM(Qty) AS TotalQty
FROM Sales
GROUP BY ROLLUP(OrderYear, ProductName);
Kết quả:
| OrderYear | ProductName | TotalQty |
|---|---|---|
| 2023 | A | 10 |
| 2023 | B | 20 |
| 2023 | NULL | 30 ← Tổng phụ 2023 |
| 2024 | A | 15 |
| 2024 | B | 25 |
| 2024 | NULL | 40 ← Tổng phụ 2024 |
| NULL | NULL | 70 ← Tổng tổng cộng |
ROLLUP = Tổng phụ theo năm + tổng tổng cộng cho tất cả các cột
3) GROUPING SETS
SELECT OrderYear, ProductName, SUM(Qty) AS TotalQty
FROM Sales
GROUP BY GROUPING SETS
(
(OrderYear, ProductName), -- Mức chi tiết
(OrderYear), -- Tổng phụ theo năm
(ProductName) -- Tổng phụ theo sản phẩm
);
Kết quả:
| OrderYear | ProductName | TotalQty |
|---|---|---|
| 2023 | A | 10 |
| 2023 | B | 20 |
| 2023 | NULL | 30 |
| 2024 | A | 15 |
| 2024 | B | 25 |
| 2024 | NULL | 40 |
| NULL | A | 25 ← Tổng sản phẩm A |
| NULL | B | 45 ← Tổng sản phẩm B |
GROUPING SETS = Chọn tổng phụ bạn muốn Không bắt buộc phải có tổng tổng cộng
4) CUBE(OrderYear, ProductName)
SELECT OrderYear, ProductName, SUM(Qty) AS TotalQty
FROM Sales
GROUP BY CUBE(OrderYear, ProductName);
Kết quả:
| OrderYear | ProductName | TotalQty |
|---|---|---|
| 2023 | A | 10 |
| 2023 | B | 20 |
| 2023 | NULL | 30 |
| 2024 | A | 15 |
| 2024 | B | 25 |
| 2024 | NULL | 40 |
| NULL | A | 25 |
| NULL | B | 45 |
| NULL | NULL | 70 ← Tổng tổng cộng |
CUBE = Tất cả các tổ hợp có thể = GROUPING SETS(chi tiết + tổng phụ năm + tổng phụ sản phẩm + tổng tổng cộng)
Tóm tắt nhanh
| Toán tử | Mô tả |
|---|---|
| ROLLUP | Tổng phụ theo thứ bậc từ trái sang phải |
| GROUPING SETS | Chọn các tổ hợp tổng phụ cụ thể bạn muốn |
| CUBE | Tất cả các tổ hợp có thể - tổng phụ hoàn chỉnh |