Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Uzyskaj liczbę określonej kategorii i dalej rozwidloną podkategorię za pomocą zapytania SQL

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Co to za błąd? Zapytanie bazy danych nie powiodło się:dane zostały obcięte dla kolumny „nazwa_kolumny” w wierszu 1

  2. MySQL REGEXP Bez spacji Bez cyfr

  3. Wydajność wstawiania MySQL InnoDB (Windows)

  4. tabele blokujące test mysqldump

  5. Pobierz wygenerowany uuid po wstawieniu php