Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Nhận số lượng danh mục cụ thể và danh mục phụ phân nhánh khác bằng cách sử dụng truy vấn SQL

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bao gồm các giá trị KHÔNG ĐƯỢC TÌM HIỂU trong kết quả truy vấn MySQL

  2. Làm cách nào để chúng tôi kiểm soát thứ tự động theo Trường trong bảng?

  3. Kết nối với máy chủ MySQL bằng C ++

  4. được lưu trữ trong trường mysql nhưng không có ngắt dòng khi echo

  5. Mysql truy vấn cùng một truy vấn với chỉ mục giây mà không nhận được thời gian Tìm nạp 10000x?