Chuyển tới nội dung chính

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​

OrderYearProductNameQty
2023A10
2023B20
2024A15
2024B25

1) GROUP BY (Cơ bản chuẩn)​

SELECT OrderYear, ProductName, SUM(Qty) AS TotalQty
FROM Sales
GROUP BY OrderYear, ProductName;

Kết quả:

OrderYearProductNameTotalQty
2023A10
2023B20
2024A15
2024B25

Đâ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ả:

OrderYearProductNameTotalQty
2023A10
2023B20
2023NULL30 ← Tổng phụ 2023
2024A15
2024B25
2024NULL40 ← Tổng phụ 2024
NULLNULL70 ← 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ả:

OrderYearProductNameTotalQty
2023A10
2023B20
2023NULL30
2024A15
2024B25
2024NULL40
NULLA25 ← Tổng sản phẩm A
NULLB45 ← 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ả:

OrderYearProductNameTotalQty
2023A10
2023B20
2023NULL30
2024A15
2024B25
2024NULL40
NULLA25
NULLB45
NULLNULL70 ← 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ả
ROLLUPTổng phụ theo thứ bậc từ trái sang phải
GROUPING SETSChọn các tổ hợp tổng phụ cụ thể bạn muốn
CUBETất cả các tổ hợp có thể - tổng phụ hoàn chỉnh