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:
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:
Estado | Count(*) |
En Proceso | 822 |
Entregado | 4 |
Cancelado | 4 |
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:
IdEmpresasTransporte | COUNT(*) | 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
IdEmpresasTransporte | Estado | Total |
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:
IdEmpresasTransporte | Estado | Total |
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.