Mysql
 sql >> база данни >  >> RDS >> Mysql

Вземете брой на конкретна категория и допълнително раздвоена подкатегория, като използвате SQL заявка

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mysql присъединяване въз основа на max(timestamp)

  2. Разходите за използване на InnoDB диск

  3. Spring JPA с помощта на спецификации и CriteriaQuery на съвместни таблици

  4. MySQL - Как да вмъкнете в множество таблици с външни ключове

  5. Уникално ограничение, което позволява празни стойности в MySQL