Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Obtenha a contagem de categoria específica e subcategoria bifurcada usando a consulta SQL


O grupo MySQL suporta WITH ROLLUP que fornecerá as agregações mais amplas para você:

Suponha que sua tabela de funcionários seja assim:
Name, Role, Gender
John, Manager, Male
Susie, Manager, Female
...

Uma consulta como esta:
SELECT Gender, Role, COUNT(*)
FROM employee
GROUP BY Gender, Role

Produziria um familiar:
Male, Manager, 5
Male, Senior Manager, 2
Male, Employee, 20

etc

Agora, se adicionarmos WITH ROLLUP:
SELECT Gender, Role, COUNT(*)
FROM employee
GROUP BY Gender, Role WITH ROLLUP

Então o MySQL também irá ignorar o Role e apenas agrupar em Gender:
Male, Manager, 5
Male, Senior Manager, 2
Male, Employee, 20
Male, NULL, 29

A linha de função NULL é a linha em que todas as funções são agrupadas e a contagem é o total de Homens. ROLLUP rola da direita para a esquerda, então se você fosse GROUP BY a,b,c,d WITH ROLLUP você obteria linhas extras para "todos a,b,c", "todos a,b" e "todos a" - então a ordem em que você coloca Gênero e Função em seu Grupo é importante!

Por fim, se você quiser reformular um pouco os dados para ter apenas uma coluna de texto, como seu exemplo:
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

Mas observe que, se você fizer isso, terá um problema porque não há mais nada para diferenciar concretamente a linha masculina de "Gerente" da linha feminina de "Gerente"; é puramente dependente da ordem, e isso não é uma boa ideia; é por isso que normalmente deixamos a subtotalização dessa forma para o front-end, para que o pacote de relatórios mantenha os dados juntos. Se você fizer algo como converter isso em JSON, enviá-lo para um computador remoto e o pedido for perdido, as informações se tornarão sem sentido. Pessoalmente, eu faria algo mais como:
SELECT Gender, COALESCE(Role, '(TOTAL)') as Role, COUNT(*)
FROM employee
GROUP BY Gender, Role WITH ROLLUP

Ele mantém os dados do gerente masculino e do gerente feminino na linha para que você possa diferenciá-los, mas converte o NULL em (Total) para melhor fornecer informações sobre o que é

Há outras coisas para discutir, como o que acontece se as colunas contiverem valores NULL, mas vou apontar para o The Fine Manual para isso:https://dev.mysql.com/doc/refman/5.7/en/group-by-modifiers.html