MySQL group by поддържа WITH ROLLUP, който ще осигури по-широките агрегирания за вас:
Да предположим, че вашата таблица на служителите е като:
Name, Role, Gender
John, Manager, Male
Susie, Manager, Female
...
Заявка като тази:
SELECT Gender, Role, COUNT(*)
FROM employee
GROUP BY Gender, Role
Ще създаде познато:
Male, Manager, 5
Male, Senior Manager, 2
Male, Employee, 20
и т.н.
Сега, ако добавим WITH ROLLUP:
SELECT Gender, Role, COUNT(*)
FROM employee
GROUP BY Gender, Role WITH ROLLUP
Тогава MySQL също ще игнорира Ролята и просто ще групира по Пол:
Male, Manager, 5
Male, Senior Manager, 2
Male, Employee, 20
Male, NULL, 29
Редът с роли NULL е редът, в който всички роли са събрани заедно и броят е общият брой мъже. ROLLUP се върти отдясно наляво, така че ако трябва да GROUP BY a,b,c,d WITH ROLLUP
ще получите допълнителни редове за „всички a,b,c“, „всички a,b“ и „всички a“ – така че редът, по който поставяте пола и ролята във вашата група, е важен!
И накрая, ако искате да направите малко преоформяне на данни, така че да имате само една колона с текст, като вашия пример:
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
Но имайте предвид, че ако направите това, ще се сблъскате с проблем, тъй като не е останало нищо, което да различи конкретно мъжкия ред „Мениджър“ освен женския ред „Мениджър“; зависи изцяло от поръчката и това не е добра идея; затова обикновено оставяме междинното сумиране по този начин на предния край, така че пакетът с отчети ще запази данните заедно. Ако направите нещо като конвертиране на това в JSON, изпращане на отдалечен компютър и подреждането се губи, информацията става безсмислена. Лично аз бих направил нещо по-скоро като:
SELECT Gender, COALESCE(Role, '(TOTAL)') as Role, COUNT(*)
FROM employee
GROUP BY Gender, Role WITH ROLLUP
Той запазва данните за мъж-мениджър и жена-мениджър в реда, за да можете да ги различите, но преобразува NULL в (Total)
за по-добро предоставяне на информация какво представлява
Има и други неща за обсъждане, като например какво, ако колоните съдържат самите стойности NULL, но ще ви насоча към The Fine Manual за това:https://dev.mysql.com/doc/refman/5.7/en/group-by-modifiers.html