sql >> Databasteknik >  >> RDS >> Mysql

Få räkning av viss kategori och ytterligare tvådelad underkategori med hjälp av SQL-fråga

MySQL-gruppen stöder MED ROLLUP som ger dig de bredare sammanställningarna:

Anta att din personaltabell är som:

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

En fråga som denna:

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

Skulle producera en bekant:

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

etc

Nu, om vi lägger till MED ROLLUP:

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

Då kommer MySQL också att ignorera rollen och bara gruppera på Gender:

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

Rollraden NULL är raden där alla roller klumpas ihop och antalet är det totala antalet män. ROLLUP rullar från höger till vänster, så om du skulle GROUP BY a,b,c,d WITH ROLLUP du skulle få extra rader för "alla a,b,c", "alla a,b" och "alla a" - så ordningen du placerar kön och roll i din grupp efter är viktig!

Slutligen, om du vill göra lite omformning av data så att du bara har en kolumn med text, som ditt exempel:

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 notera att om du gör detta kommer du att stöta på ett problem eftersom det inte finns något kvar att konkret tala om för den manliga "Manager"-raden förutom den kvinnliga "Manager"-raden; det är helt beroende av beställningen, och det är ingen bra idé; det är därför vi vanligtvis lämnar delsummor på detta sätt till användargränssnittet, så att rapportpaketet kommer att hålla ihop data. Om du gör något som att konvertera detta till JSON, skicka det till en fjärrdator och beställningen går förlorad, blir informationen meningslös. Personligen skulle jag göra något mer som:

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

Den behåller data om manlig chef och kvinnlig chef på raden så att du kan skilja dem åt, men den konverterar NULL till (Total) för att bättre ge information om vad det är

Det finns andra saker att diskutera, till exempel vad händer om kolumner innehåller NULL-värden själva, men jag pekar på The Fine Manual för det:https://dev.mysql.com/doc/refman/5.7/en/group-by-modifiers.html



  1. mysql cpp-anslutningen kastar okänt undantag under anslutning

  2. TO_DATE funktion tidszon analysfel

  3. PHP/MySQL-frågeresultat

  4. Hur kan jag ställa in ett databasschema där det finns två samtidiga många-många-relationer?