sql >> Databáze >  >> RDS >> Mysql

Získejte počet konkrétní kategorie a dále rozvětvené podkategorie pomocí SQL dotazu

MySQL group by podporuje WITH ROLLUP, která vám poskytne širší agregace:

Předpokládejme, že vaše tabulka zaměstnanců je podobná:

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

Dotaz jako tento:

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

Vzniklo by známé:

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

atd

Nyní, když přidáme WITH ROLLUP:

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

Pak bude MySQL také ignorovat Role a pouze seskupit podle Gender:

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

Řádek role NULL je řádek, kde jsou všechny role soustředěny dohromady a počet je celkový počet mužů. ROLLUP se hází zprava doleva, takže pokud byste měli GROUP BY a,b,c,d WITH ROLLUP získáte další řádky pro „všechny a,b,c“, „všechny a,b“ a „všechny a“ – takže pořadí, do kterého zařadíte pohlaví a roli ve vaší skupině, je důležité!

A konečně, pokud chcete trochu přetvořit data, abyste měli pouze jeden sloupec textu, jako je váš příklad:

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

Uvědomte si však, že pokud to uděláte, narazíte na problém, protože nezbývá nic, co by konkrétně odlišilo mužskou řadu „Manager“ od ženské řady „Manager“; je to čistě závislé na objednávce, a to není skvělý nápad; to je důvod, proč obvykle necháváme mezisoučty tímto způsobem na frontendu, takže balíček sestav bude udržovat data pohromadě. Pokud něco takového převedete na JSON, pošlete to na vzdálený počítač a objednávka se ztratí, informace ztrácí smysl. Osobně bych udělal něco víc jako:

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

Udržuje data muž-manažerka a žena-manažerka na řádku, abyste je mohli rozlišit, ale převádí NULL na (Total) pro lepší poskytování informací o tom, co to je

Existují další věci, o kterých je třeba diskutovat, například co když sloupce obsahují hodnoty NULL, ale na to vás odkážu na The Fine Manual:https://dev.mysql.com/doc/refman/5.7/en/group-by-modifiers.html



  1. Jak sloučit dva sloupce v SQL a zobrazit je do samostatného záznamu

  2. získání tří záznamů v sestupném pořadí každé kategorie pomocí codeigniter

  3. Oracle REGEXP_SUBSTR až SUBSTR + INSTR

  4. Řetězec proměnné MySQL REPLACE