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

Få optælling af en bestemt kategori og yderligere todelt underkategori ved hjælp af SQL-forespørgsel

MySQL-gruppen understøtter MED ROLLUP, der vil give dig de bredere samlinger:

Antag, at dit medarbejderbord er sådan:

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

En forespørgsel som denne:

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

Ville producere en velkendt:

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

osv.

Nu, hvis vi tilføjer MED ROLLUP:

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

Så vil MySQL også ignorere rollen og bare gruppere på køn:

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

NULL-rollerækken er rækken, hvor alle roller er klumpet sammen, og antallet er det samlede antal hanner. ROLLUP ruller fra højre mod venstre, så hvis du skulle GROUP BY a,b,c,d WITH ROLLUP du vil få ekstra rækker for "alle a,b,c", "alle a,b" og "alle a" - så rækkefølgen du placerer køn og rolle i din gruppe efter er vigtig!

Til sidst, hvis du vil lave en smule dataomformning, så du kun har én kolonne med tekst, som dit eksempel:

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

Men bemærk, at hvis du gør dette, vil du løbe ind i et problem, fordi der ikke er noget tilbage til konkret at fortælle den mandlige "Manager" række bortset fra den kvindelige "Manager" række; det er udelukkende afhængig af ordren, og det er ikke nogen god idé; Det er derfor, vi typisk overlader subtotal på denne måde til frontend, så rapportpakken vil holde dataene samlet. Hvis du gør noget som at konvertere dette til JSON, sende det til en fjerncomputer, og bestillingen går tabt, bliver informationen meningsløs. Personligt ville jeg gøre noget mere som:

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

Det gemmer data for mandlige ledere og kvindelige ledere på rækken, så du kan skelne dem fra hinanden, men det konverterer NULL til (Total) for bedre at give information om, hvad det er

Der er andre ting at diskutere, såsom hvad hvis kolonner selv indeholder NULL-værdier, men jeg vil henvise dig til The Fine Manual for det:https://dev.mysql.com/doc/refman/5.7/en/group-by-modifiers.html



  1. Hvordan deaktiverer man kolonnestatistik i MySQL 8 permanent?

  2. MYSQL vælg 2 tilfældige rækker fra hver kategori

  3. MySQL opdateres ikke efter opkald til connection.commit() med Flask (FUNGERER)

  4. Ligheder og forskelle mellem funktionerne RANK, DENSE_RANK og ROW_NUMBER