Il gruppo MySQL di supporta WITH ROLLUP che ti fornirà le aggregazioni più ampie:
Supponiamo che la tua tabella dei dipendenti sia simile a:
Name, Role, Gender
John, Manager, Male
Susie, Manager, Female
...
Una query come questa:
SELECT Gender, Role, COUNT(*)
FROM employee
GROUP BY Gender, Role
Produrrebbe un familiare:
Male, Manager, 5
Male, Senior Manager, 2
Male, Employee, 20
ecc
Ora, se aggiungiamo WITH ROLLUP:
SELECT Gender, Role, COUNT(*)
FROM employee
GROUP BY Gender, Role WITH ROLLUP
Quindi MySQL ignorerà anche il ruolo e si limiterà a raggruppare su Genere:
Male, Manager, 5
Male, Senior Manager, 2
Male, Employee, 20
Male, NULL, 29
La riga del ruolo NULL è la riga in cui tutti i ruoli sono raggruppati e il conteggio è il totale dei maschi. ROLLUP rotola da destra a sinistra, quindi se dovessi GROUP BY a,b,c,d WITH ROLLUP
otterresti righe extra per "tutti a,b,c", "tutti a,b" e "tutti a", quindi l'ordine in cui inserisci Sesso e Ruolo nel tuo gruppo è importante!
Infine, se vuoi fare un po' di rimodellamento dei dati in modo da avere solo una colonna di testo, come il tuo esempio:
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
Ma nota che se lo fai, ti imbatterai in un problema perché non c'è più nulla da dire concretamente alla riga maschile "Manager" a parte la riga femminile "Manager"; dipende esclusivamente dall'ordine e non è una buona idea; è per questo che in genere lasciamo il totale parziale in questo modo al front-end, quindi il pacchetto di rapporti manterrà i dati insieme. Se fai qualcosa come convertirlo in JSON, inviarlo a un computer remoto e l'ordine viene perso, le informazioni diventano prive di significato. Personalmente farei qualcosa di più tipo:
SELECT Gender, COALESCE(Role, '(TOTAL)') as Role, COUNT(*)
FROM employee
GROUP BY Gender, Role WITH ROLLUP
Mantiene i dati del manager maschile e del manager femminile sulla riga in modo da poterli distinguere, ma converte il NULL in (Total)
per fornire meglio informazioni su di cosa si tratta
Ci sono altre cose di cui discutere, ad esempio cosa succede se le colonne contengono valori NULL stessi, ma ti indirizzerò a The Fine Manual per questo:https://dev.mysql.com/doc/refman/5.7/en/group-by-modifiers.html