sql >> Database >  >> RDS >> Mysql

Krijg het aantal van een bepaalde categorie en verder gesplitste subcategorie met behulp van SQL-query

MySQL-groep door ondersteunt WITH ROLLUP die de bredere aggregaties voor u zal bieden:

Stel dat uw werknemerstabel er zo uitziet:

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

Een zoekopdracht als deze:

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

Zou een bekende opleveren:

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

enz.

Als we nu WITH ROLLUP toevoegen:

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

Dan zal MySQL ook de rol negeren en gewoon groeperen op geslacht:

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

De NULL-rollenrij is de rij waar alle rollen op één hoop worden gegooid en het aantal is het totaal van de mannen. ROLLUP rolt van rechts naar links, dus als u GROUP BY a,b,c,d WITH ROLLUP je zou extra rijen krijgen voor "all a,b,c", "all a,b" en "all a" - dus de volgorde waarin je geslacht en rol in je groep plaatst is belangrijk!

Ten slotte, als je een beetje gegevens wilt aanpassen zodat je maar één kolom tekst hebt, zoals je voorbeeld:

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

Maar houd er rekening mee dat als je dit doet, je een probleem tegenkomt omdat er niets meer is om de mannelijke "Manager"-rij concreet te onderscheiden van de vrouwelijke "Manager"-rij; het is puur afhankelijk van de bestelling, en dat is geen geweldig idee; daarom laten we subtotalen op deze manier meestal over aan de front-end, zodat het rapportpakket de gegevens bij elkaar houdt. Als je zoiets doet als dit naar JSON converteert, het naar een externe computer stuurt en de bestelling verloren gaat, wordt de info zinloos. Persoonlijk zou ik meer doen als:

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

Het houdt de gegevens van de mannelijke manager en de vrouwelijke manager op de rij zodat u ze van elkaar kunt onderscheiden, maar het converteert de NULL naar (Total) om beter informatie te geven over wat het is

Er zijn andere dingen om te bespreken, zoals wat als kolommen zelf NULL-waarden bevatten, maar ik zal u daarvoor verwijzen naar The Fine Manual:https://dev.mysql.com/doc/refman/5.7/en/group-by-modifiers.html



  1. Vind overlappende (datum/tijd) rijen binnen één tabel

  2. PHP OCI, Oracle en standaard getalnotatie

  3. MySQL:maximale waarden van groepen ophalen

  4. Is de volgorde van velden van de index met meerdere kolommen in MySQL van belang?