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