Mysql
 sql >> Database >  >> RDS >> Mysql

Ottieni il conteggio di una particolare categoria e di un'ulteriore sottocategoria biforcata utilizzando la query SQL

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