Nhóm MySQL hỗ trợ WITH ROLLUP sẽ cung cấp các tổng hợp rộng hơn cho bạn:
Giả sử bảng nhân viên của bạn giống như:
Name, Role, Gender
John, Manager, Male
Susie, Manager, Female
...
Một truy vấn như thế này:
SELECT Gender, Role, COUNT(*)
FROM employee
GROUP BY Gender, Role
Sẽ tạo ra một quen thuộc:
Male, Manager, 5
Male, Senior Manager, 2
Male, Employee, 20
vv
Bây giờ, nếu chúng ta thêm WITH ROLLUP:
SELECT Gender, Role, COUNT(*)
FROM employee
GROUP BY Gender, Role WITH ROLLUP
Sau đó, MySQL cũng sẽ bỏ qua Vai trò và chỉ nhóm trên Giới tính:
Male, Manager, 5
Male, Senior Manager, 2
Male, Employee, 20
Male, NULL, 29
Hàng vai trò NULL là hàng trong đó tất cả các vai trò được gộp lại với nhau và số lượng là tổng số Nam. ROLLUP cuộn từ phải sang trái, vì vậy nếu bạn tham gia GROUP BY a,b,c,d WITH ROLLUP
bạn sẽ nhận được các hàng bổ sung cho "tất cả a, b, c", "tất cả a, b" và "tất cả a" - vì vậy thứ tự bạn đặt Giới tính và Vai trò trong Nhóm của mình là rất quan trọng!
Cuối cùng, nếu bạn muốn định hình lại một chút dữ liệu để bạn chỉ có một cột văn bản, như ví dụ của bạn:
SELECT COALESCE(Role, Gender) as Desc, Ctr
(
SELECT Gender, Role, COUNT(*) as Ctr
FROM employee
GROUP BY Gender, Role WITH ROLLUP
) x --need to use a subquery - see manual
ORDER BY Gender, Role
Nhưng hãy lưu ý rằng nếu bạn làm điều này, bạn sẽ gặp phải vấn đề vì không còn gì để nói cụ thể hàng "Người quản lý" nam ngoài hàng "Người quản lý" nữ; nó hoàn toàn phụ thuộc vào đơn đặt hàng và đó không phải là một ý tưởng tuyệt vời; đó là lý do tại sao chúng tôi thường để gọi điện con theo cách này cho giao diện người dùng, vì vậy gói báo cáo sẽ giữ dữ liệu lại với nhau. Nếu bạn làm điều gì đó như chuyển đổi nó thành JSON, gửi nó đến một máy tính từ xa và thứ tự bị mất, thông tin sẽ trở nên vô nghĩa. Cá nhân tôi muốn làm một cái gì đó hơn như:
SELECT Gender, COALESCE(Role, '(TOTAL)') as Role, COUNT(*)
FROM employee
GROUP BY Gender, Role WITH ROLLUP
Nó giữ dữ liệu người quản lý nam và người quản lý nữ trên hàng để bạn có thể phân biệt chúng, nhưng nó chuyển đổi NULL thành (Total)
để cung cấp thông tin tốt hơn về nó là gì
Có những điều khác cần thảo luận, chẳng hạn như điều gì xảy ra nếu các cột tự chứa giá trị NULL, nhưng tôi sẽ chỉ bạn đến Sách hướng dẫn sử dụng tốt cho điều đó:https://dev.mysql.com/doc/refman/5.7/en/group-by-modifiers.html