sql >> Base de Datos >  >> RDS >> Mysql

Obtenga el recuento de una categoría particular y una subcategoría bifurcada adicional mediante una consulta SQL

El grupo MySQL por soportes CON ROLLUP que le proporcionará las agregaciones más amplias:

Suponga que su tabla de empleados es como:

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

Una consulta como esta:

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

Produciría un familiar:

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

etc.

Ahora, si agregamos CON ROLLUP:

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

Entonces MySQL también ignorará el Rol y solo se agrupará en Género:

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

La fila de funciones NULL es la fila donde se agrupan todas las funciones y el recuento es el total de hombres. ROLLUP rueda de derecha a izquierda, por lo que si tuviera que GROUP BY a,b,c,d WITH ROLLUP obtendría filas adicionales para "todos los a, b, c", "todos los a, b" y "todos los a", ¡así que el orden en que coloca Género y Rol en su grupo es importante!

Por último, si desea remodelar un poco los datos para que solo tenga una columna de texto, como su ejemplo:

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

Pero tenga en cuenta que si hace esto, se encontrará con un problema porque no queda nada para diferenciar concretamente la fila "Gerente" masculina de la fila "Gerente" femenina; depende puramente de la orden, y eso no es una gran idea; es por eso que normalmente dejamos el subtotal de esta manera al principio, para que el paquete de informes mantenga los datos juntos. Si hace algo como convertir esto a JSON, enviarlo a una computadora remota y se pierde el pedido, la información no tiene sentido. Personalmente, haría algo más como:

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

Mantiene los datos de gerente masculino y gerente femenino en la fila para que pueda distinguirlos, pero convierte NULL en (Total) para proporcionar mejor información sobre lo que es

Hay otras cosas para discutir, como qué pasa si las columnas contienen valores NULL en sí mismas, pero le indicaré The Fine Manual para eso:https://dev.mysql.com/doc/refman/5.7/es/agrupar-por-modificadores.html