Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Rufen Sie die Anzahl der bestimmten Kategorien und weiteren gegabelten Unterkategorien mithilfe einer SQL-Abfrage ab

MySQL Group by unterstützt WITH ROLLUP, das die breiteren Aggregationen für Sie bereitstellt:

Angenommen, Ihre Mitarbeitertabelle sieht folgendermaßen aus:

Name, Role, Gender
John, Manager, Male
Susie, Manager, Female
...

Eine Abfrage wie diese:

SELECT Gender, Role, COUNT(*)
FROM employee
GROUP BY Gender, Role

Würde ein vertrautes erzeugen:

Male, Manager, 5
Male, Senior Manager, 2
Male, Employee, 20

usw.

Wenn wir jetzt WITH ROLLUP hinzufügen:

SELECT Gender, Role, COUNT(*)
FROM employee
GROUP BY Gender, Role WITH ROLLUP

Dann ignoriert MySQL auch die Rolle und gruppiert nur nach Geschlecht:

Male, Manager, 5
Male, Senior Manager, 2
Male, Employee, 20
Male, NULL, 29

Die NULL-Rollenzeile ist die Zeile, in der alle Rollen zusammengefasst werden und die Anzahl die Gesamtzahl der Männer ist. ROLLUP rollt von rechts nach links, also wenn Sie GROUP BY a,b,c,d WITH ROLLUP verwenden würden Sie würden zusätzliche Zeilen für „alle a,b,c“, „alle a,b“ und „alle a“ erhalten – daher ist die Reihenfolge, in der Sie Geschlecht und Rolle in Ihrer Gruppe anordnen, wichtig!

Wenn Sie die Daten ein wenig umformen möchten, haben Sie schließlich nur eine Textspalte, wie in Ihrem Beispiel:

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

Beachten Sie jedoch, dass Sie in diesem Fall auf ein Problem stoßen, da es nichts mehr gibt, um die männliche „Manager“-Reihe konkret von der weiblichen „Manager“-Reihe zu unterscheiden; es ist rein abhängig von der Reihenfolge, und das ist keine gute Idee; Aus diesem Grund überlassen wir die Zwischensummenbildung normalerweise dem Frontend, sodass das Berichtspaket die Daten zusammenhält. Wenn Sie dies beispielsweise in JSON konvertieren, an einen Remotecomputer senden und die Bestellung verloren geht, werden die Informationen bedeutungslos. Persönlich würde ich eher so etwas tun:

SELECT Gender, COALESCE(Role, '(TOTAL)') as Role, COUNT(*)
FROM employee
GROUP BY Gender, Role WITH ROLLUP

Es behält die Daten des männlichen Managers und der weiblichen Manager in der Zeile, damit Sie sie voneinander unterscheiden können, aber es konvertiert NULL in (Total) um besser zu informieren, was es ist

Es gibt noch andere Dinge zu besprechen, wie zum Beispiel Was-wäre-wenn-Spalten selbst NULL-Werte enthalten, aber ich verweise Sie dafür auf The Fine Manual:https://dev.mysql.com/doc/refman/5.7/en/group-by-modifiers.html