GROUP BY MySQL Agrupando Resultados

Saludos estimado lector, en este tutorial aprenderá a utilizar el GROUP BY MySQL para agrupar filas en subgrupos según los valores de las columnas o expresiones especificadas.

Introducción

La cláusula GROUP BY agrupa un conjunto de filas en un grupo de filas de resumen por valores de columnas o expresiones. La cláusula GROUP BY devuelve una fila para cada grupo. En otras palabras, reduce el número de filas en el conjunto de resultados.

Támbien te puede interesar
como relizar consultar con MySQL SELECT

La clausura GROUP BY resume un grupo de filas o resultados en una única fila, esto quiere decir que si tienes varias filas con los mismos datos, el resultado que veras es un registro que resume a todos los iguales y estos son considerados como grupos.

Ilustración

Quiero ilustrar esto con un ejemplo:

Group-by

Imaginemos que estamos en un salón, y nos piden que a un lado se coloquen los hombres y al otro lado las mujeres, ahí ya tenemos 2 grupos, sin embargo también se nos pide que seleccionemos a un representante para cada grupo, esta persona representante es quien saldrá al frente cuando sea necesario, pero eso no quiere decir que los demás miembros del grupo dejaron de existir.

Ahora bien si se nos pide que calculemos la edad promedio de cada grupo, entonces los cálculos se realizaran sobre cada grupo por separado, promedio de hombres, promedio de mujeres, pero siempre tendremos 2 valores, 1 para cada grupo.

Realiza consultas a dos o más tablas utilizando select join

Así mismo podríamos crear más grupos, por ejemplo los niños y los envejecientes, y así sucesivamente, de una forma similar funciona el GROUP BY, agrupando los registros y dejando solo un registro visible como representante del grupo.

GROUP BY vs DISTINCT

Cuando estamos iniciando con el lenguaje SQL, tendemos a confundir el funcionamiento de la clausura GROUP BY con la clausura DISTINCT, pero debemos recordar que DISTINCT elimina filas repetidas del resultado, y como acabamos de decir el GROUP_BY agrupa las filas repetidas y las trata como un solo grupo.

GROUP BY y SUM, MAX, AVG, COUNT, MIN

Es muy común utilizar el GROUP BY con las funciones de agregación como son MAX, MIN, SUM, COUNT y SUM. Especialmente para realizar cálculos sobre los grupos y más.

Sintaxis

SELECT 
  col_1,
  col_2,
  col_n,
  funciones_de_agregacion
FROM
    table
WHERE
    condiciones
GROUP BY
   col_1,
   col_2,
   col_n
HAVIGN 
   expresion

La cláusula GROUP BY debe aparecer después de las cláusulas FROM y WHERE.

Después de GROUP BY colocamos separadas por coma las columnas o expresiones  que serán utilizadas como criterio para agrupar las filas.

Ejemplos de GROUP BY MySQL

Utilizaremos la base de datos shoppy disponible desde este enlace, la tabla a utilizar es ordenes.

Para este ejemplo vamos a seleccionar los estados de las ordenes y agruparlos por estado.

SELECT 
    estado
FROM
    ordenes
GROUP BY estado;

Como resultado obtendremos:

Estado
En Proceso
Entregado
Cancelado

Esta tabla contiene alrededor de 850 registros, pero al utilizar GROUP BY el resultado se reduce a 3 registros, quiero aclarar que no se eliminó los registros repetidos (Comportamiento típico del DISTINCT), si no que solo muestra los valores únicos.

GROUP BY con funciones de agregación.

Las funciones de agregación permiten realizar cálculos de un conjunto de filas y devolver un solo valor. La cláusula GROUP BY a menudo se usa con una función de agregación para realizar cálculos y devolver un solo valor para cada subgrupo.

Por ejemplo, se desea conocer cuantos pedidos hay en cada estado, podemos agregar la función COUNT de la siguiente manera:

SELECT 
    estado, COUNT(*)
FROM
    ordenes
GROUP BY estado;

Y tendremos el siguiente resultado:

EstadoCount(*)
En Proceso822
Entregado4
Cancelado4

También podemos utilizar más de una función de agregación en los grupos.

En este ejemplo utilizaré los campos idEmpresasTransporte y cargo, donde agruparé por idEmpresasTransporte, tambien obtendré el total de pedido y adicionalmente la sumatoria de los cargos pagado por cada empresa de transporte.


SELECT 
    idEmpresasTransporte, 
    count(*), 
    sum(cargo) 
FROM 
    pedido 
GROUP BY 
    idEmpresasTransporte;

Dando como resultado:

IdEmpresasTransporteCOUNT(*)SUM(cargo)
1 248 16155.86
2 327 28274.31
3 255 20512.51

GROUP BY MySQL con dos o más columnas

Si verificamos nuevamente la sintaxis de esta clausura podemos notar que es posible agrupar por una columna o por varias, veamos un ejemplo.

Obtendremos la cantidad de pedidos en proceso por empresa de transporte y por su estado.

SELECT 
    idEmpresasTransporte,  
    estado, 
    count(*)  as 'total'
FROM 
    pedido 
GROUP BY 
    idEmpresasTransporte, estado
ORDER BY
    idEmpresasTransporte

El resultado es un grupo por cada filas

IdEmpresasTransporteEstadoTotal
1 En Proceso 247
1 Entregado 1
2 Cancelado 1
2 En Proceso 323
2 Entregado 3
3 Cancelado 3
3 En Proceso 252

GROUP BY y HAVING

También existe una clausura llamada HAVING la cual funciona de forma similar al WHERE, la diferencia es que esta se aplica a los grupos despues de que el WHERE a hecho su trabajo.

Adicionalmente el WHERE no permite utilizar funciones de agregacion (SUM, AVG, etc.) en cambio el HAVING si te permite utilizar estas, lo cual es bien conveniente en muchos de los casos.

Hay que destacar que el HAVING solo funciona con el GROUP BY y este debe colocarse luego de el.

Para este ejemplo seleccionaremos las empresas que tienen más de 250 pedidos con estado “en proceso”

SELECT 
    idEmpresasTransporte, 
    estado, 
    count(*) as 'Total'
FROM 
    pedido 
WHERE 
    estado = 'en proceso'
GROUP BY 
   idEmpresasTransporte, estado
HAVING 
    count(*) > 250
ORDER BY 
    idEmpresasTransporte

Como resultado tendremos lo siguiente:

IdEmpresasTransporteEstadoTotal
2 En Proceso 323
3 En Proceso 252

Espero que este tutorial te sea de mucha utilidad, y recuerda compartir con otros.

Tambíen puedes valorar este post más abajo.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.