Toán tử ROLLUP và CUBE được sử dụng để trả về kết quả được tổng hợp bởi các cột trong mệnh đề GROUP BY.
Các hàm GROUPING và GROUPING_ID được sử dụng để xác định xem các cột trong danh sách GROUP BY có được tổng hợp hay không (sử dụng toán tử ROLLUP hoặc CUBE) hay không.
Có hai điểm khác biệt chính giữa Hàm GROUPING và GROUPING_ID.
Chúng như sau:
- Hàm GROUPING có thể áp dụng trên một cột, trong khi danh sách cột cho hàm GROUPING_ID phải khớp với danh sách cột trong mệnh đề GROUP BY.
- Hàm GROUPING cho biết liệu một cột trong danh sách GROUP BY có được tổng hợp hay không. Nó trả về 1 nếu tập kết quả được tổng hợp và 0 nếu tập kết quả không được tổng hợp.
Mặt khác, hàm GROUPING_ID cũng trả về một số nguyên. Tuy nhiên, nó thực hiện chuyển đổi từ nhị phân sang thập phân sau khi nối kết quả của tất cả các hàm GROUPING.
Trong bài viết này, chúng ta sẽ thấy các hàm GROUPING và GROUPING_ID đang hoạt động với sự trợ giúp của các ví dụ.
Chuẩn bị một số dữ liệu giả
Như mọi khi, hãy tạo một số dữ liệu giả mà chúng ta sẽ sử dụng cho ví dụ mà chúng ta sẽ làm việc trong bài viết này.
Thực thi tập lệnh sau:
CREATE Database company; USE company; CREATE TABLE employee ( id INT PRIMARY KEY, name VARCHAR(50) NOT NULL, gender VARCHAR(50) NOT NULL, salary INT NOT NULL, department VARCHAR(50) NOT NULL ) INSERT INTO employee VALUES (1, 'David', 'Male', 5000, 'Sales'), (2, 'Jim', 'Female', 6000, 'HR'), (3, 'Kate', 'Female', 7500, 'IT'), (4, 'Will', 'Male', 6500, 'Marketing'), (5, 'Shane', 'Female', 5500, 'Finance'), (6, 'Shed', 'Male', 8000, 'Sales'), (7, 'Vik', 'Male', 7200, 'HR'), (8, 'Vince', 'Female', 6600, 'IT'), (9, 'Jane', 'Female', 5400, 'Marketing'), (10, 'Laura', 'Female', 6300, 'Finance'), (11, 'Mac', 'Male', 5700, 'Sales'), (12, 'Pat', 'Male', 7000, 'HR'), (13, 'Julie', 'Female', 7100, 'IT'), (14, 'Elice', 'Female', 6800,'Marketing'), (15, 'Wayne', 'Male', 5000, 'Finance')
Trong đoạn mã ở trên, chúng tôi đã tạo một cơ sở dữ liệu có tên là “Công ty”. Sau đó, chúng tôi đã tạo một bảng “Nhân viên” trong cơ sở dữ liệu Công ty. Cuối cùng, chúng tôi đã chèn một số bản ghi giả vào bảng Nhân viên.
Chức năng NHÓM
Như đã đề cập ở trên, hàm GROUPING trả về 1 nếu tập kết quả được tổng hợp và 0 nếu tập kết quả không được tổng hợp.
Hãy xem tập lệnh sau để biết chức năng GROUPING đang hoạt động.
SELECT department AS Department, gender AS Gender, sum(salary) as Salary_Sum, GROUPING(department) as GP_Department, GROUPING(gender) as GP_Gender FROM employee GROUP BY ROLLUP (department, gender)
Tập lệnh trên đếm tổng tiền lương của tất cả nhân viên nam và nữ, được nhóm đầu tiên theo cột Bộ phận và sau đó là cột Giới tính. Hai cột khác được thêm vào để hiển thị kết quả của chức năng NHÓM được áp dụng cho các cột Bộ phận và Giới tính.
Toán tử ROLLUP được sử dụng để hiển thị tổng tiền lương ở dạng tổng lớn và tổng phụ.
Đầu ra của tập lệnh ở trên trông giống như thế này.
Hãy xem kỹ đầu ra. Tổng tiền lương được hiển thị theo giới tính theo giới tính của bộ phận (hàng 1, 2, 4, 5, 7, 9, 10 và 12). Sau đó, nó cũng chỉ được tổng hợp theo giới tính (hàng 3, 6, 8, 11 và 13). Cuối cùng, tổng số tiền lương được tổng hợp bởi cả Bộ phận và Giới tính được hiển thị ở hàng 14.
1 được hiển thị trong cột hàm NHÓM GP_Gender cho các hàng nơi kết quả được tổng hợp theo giới tính, tức là hàng 3, 6, 8, 11 và 13. Điều này là do cột GP_Gender chứa kết quả của hàm GROUPING được áp dụng cho cột Giới tính.
Tương tự, hàng 14 chứa tổng tổng hợp của tất cả các phòng ban và tất cả các cột. Do đó, 1 được trả về cho cả cột GP_Department và GP_Gender.
Bạn có thể thấy NULL được hiển thị trong các cột Sở và Giới tính trong đầu ra nơi kết quả được tổng hợp. Ví dụ trong hàng 3, NULL được hiển thị trong cột Giới tính vì kết quả được tổng hợp theo cột giới tính và do đó không có giá trị cột nào để hiển thị. Chúng tôi không muốn người dùng của mình nhìn thấy NULL, một từ tốt hơn ở đây có thể là “Tất cả giới tính”.
Để làm điều này, chúng tôi phải sửa đổi tập lệnh của mình như sau:
SELECT CASE WHEN GROUPING(department) = 1 THEN 'All Departments' ELSE ISNULL(department, 'Unknown') END as Department, CASE WHEN GROUPING(gender) = 1 THEN 'All Genders' ELSE ISNULL(gender, 'Unknown') END as Gender, sum(salary) as Salary_Sum FROM employee GROUP BY ROLLUP (department, gender)
Trong đoạn mã ở trên, nếu chức năng NHÓM được áp dụng cho cột Phòng ban sẽ trả về 1 và “Tất cả các Phòng ban” được hiển thị trong cột Phòng ban. Ngược lại, nếu cột Sở chứa giá trị NULL, thì nó sẽ hiển thị “Không xác định”. Cột giới tính đã được sửa đổi theo cách tương tự.
Chạy đoạn mã ở trên trả về các kết quả sau:
Bạn có thể thấy rằng NULL trong các cột Phòng ban và Giới tính nơi hàm GROUPING trả về 1, đã được thay thế bằng “Tất cả các Phòng ban” và “Tất cả Giới tính”, tương ứng.
Hàm GROUPING_ID
Hàm GROUPING_ID nối kết quả đầu ra của các hàm GROUPING được áp dụng cho tất cả các cột được chỉ định trong mệnh đề GROUP BY. Sau đó, nó thực hiện chuyển đổi từ nhị phân sang thập phân trước khi trả về kết quả cuối cùng.
Đầu tiên, chúng ta hãy nối kết quả đầu ra được trả về bởi hàm GROUPING được áp dụng cho các cột Bộ phận và Giới tính. Hãy xem tập lệnh sau:
USE company SELECT department AS Department, gender AS Gender, sum(salary) as Salary_Sum, CAST(GROUPING(department) AS VARCHAR(1)) + CAST(GROUPING(gender) AS VARCHAR (1)) as Grouping FROM employee GROUP BY ROLLUP (department, gender)
Trong đầu ra, bạn sẽ thấy các số 0 và 1 được trả về bởi hàm GROUPING được nối với nhau. Đầu ra trông giống như sau:
Hàm GROUPING_ID chỉ trả về giá trị thập phân tương đương với giá trị nhị phân được tạo thành do kết quả của việc ghép các giá trị được trả về bởi các hàm GROUPING.
Thực thi tập lệnh sau để xem chức năng ID NHÓM đang hoạt động:
USE company SELECT department AS Department, gender AS Gender, sum(salary) as Salary_Sum, CAST(GROUPING(department) AS VARCHAR(1)) + CAST(GROUPING(gender) AS VARCHAR (1)) as Grouping, GROUPING_ID(department, gender) as Grouping_Id FROM employee GROUP BY ROLLUP (department, gender)
Đối với hàng 1, hàm NHÓM ID sẽ trả về 0 vì giá trị tương đương thập phân của ‘00’ là 0.
Đối với các hàng 3, 6, 8, 11 và 13, hàm GROUPING_ID trả về 1 vì giá trị tương đương thập phân của ‘01’ là 1.
Cuối cùng, đối với hàng 14, hàm GROUPIND_ID trả về 3, vì giá trị tương đương nhị phân của ‘11’ là 3.
Đầu ra của tập lệnh ở trên trông giống như sau:
Xem thêm:
Microsoft:Tổng quan về Grouping_ID
Microsoft:Tổng quan về Nhóm
YouTube:Grouping &Grouping_ID