Grupowanie MySQL przez obsługuje Z ROLLUP, które zapewni Ci szersze agregacje:
Załóżmy, że tabela pracowników wygląda następująco:
Name, Role, Gender
John, Manager, Male
Susie, Manager, Female
...
Zapytanie takie jak to:
SELECT Gender, Role, COUNT(*)
FROM employee
GROUP BY Gender, Role
Wytworzy znajomy:
Male, Manager, 5
Male, Senior Manager, 2
Male, Employee, 20
itp.
Teraz, jeśli dodamy Z ROLLUP:
SELECT Gender, Role, COUNT(*)
FROM employee
GROUP BY Gender, Role WITH ROLLUP
Wtedy MySQL zignoruje również rolę i po prostu pogrupuje według płci:
Male, Manager, 5
Male, Senior Manager, 2
Male, Employee, 20
Male, NULL, 29
Wiersz ról NULL to wiersz, w którym wszystkie role są połączone razem, a liczba jest sumą samców. ROLLUP przewija się od prawej do lewej, więc jeśli miałbyś GROUP BY a,b,c,d WITH ROLLUP
otrzymasz dodatkowe wiersze dla "wszystkie a,b,c", "wszystkie a,b" i "wszystkie a" - więc kolejność, w jakiej umieszczasz Płeć i Rolę w swojej grupie, jest ważna!
Na koniec, jeśli chcesz trochę zmienić kształt danych, aby mieć tylko jedną kolumnę tekstu, na przykład:
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
Pamiętaj jednak, że jeśli to zrobisz, natkniesz się na problem, ponieważ nie ma już nic, co można by konkretnie odróżnić od męskiego wiersza „Menedżer” poza żeńskim wierszem „Menedżer”. zależy to wyłącznie od zamówienia, a to nie jest świetny pomysł; dlatego zwykle zostawiamy w ten sposób sumy częściowe na front end, aby pakiet raportów przechowywał dane razem. Jeśli zrobisz coś takiego, jak przekonwertujesz to na JSON, wyślesz go do zdalnego komputera, a kolejność zostanie utracona, informacje staną się bez znaczenia. Osobiście zrobiłbym coś więcej jak:
SELECT Gender, COALESCE(Role, '(TOTAL)') as Role, COUNT(*)
FROM employee
GROUP BY Gender, Role WITH ROLLUP
Utrzymuje dane menedżera męskiego i menedżera żeńskiego w wierszu, dzięki czemu można je odróżnić, ale konwertuje NULL na (Total)
aby lepiej informować o tym, co to jest
Są jeszcze inne rzeczy do omówienia, na przykład co, jeśli kolumny zawierają same wartości NULL, ale wskażę Ci w tym celu The Fine Manual:https://dev.mysql.com/doc/refman/5.7/en/group-by-modifiers.html