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