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