ERRORES COMUNES CON GROUP BY EN MYSQL
El comando "GROUP BY" es una de las herramientas más poderosas de SQL para resumir y analizar datos. Sin embargo, también es una de las que más confusiones genera, especialmente en MySQL. A continuación se muestran los errores más frecuentes al usarlo y la forma correcta de evitarlos.
Seleccionar columnas que no están en el GROUP BY
Incorrecto
SELECT Ciudad, Nombre, COUNT(*)
FROM Clientes
GROUP BY Ciudad;
Correcto
SELECT Ciudad, COUNT(*)
FROM Clientes
GROUP BY Ciudad;
>
En MySQL.,especialmente con el modo "ONLY_FULL_GROUP_BY" activado, que es el predeterminado desde la versión 5.7, solo se pueden seleccionar columnas que estén en el "GROUP BY" o que usen una función de agregación como "COUNT", "SUM", "AVG", "MIN", "MAX", etc.. Si realmente se necesita el campo "Nombre", se debe agregarlo al "GROUP BY" o usar una función de agregación sobre él.
Olvidar las funciones de agregación
Incorrecto
SELECT Departamento, Salario
FROM Empleados
GROUP BY Departamento;
Correcto
SELECT Departamento, SUM(Salario) AS Total
FROM Empleados
GROUP BY Departamento;
Cuando se usa "GROUP BY", se está pidiendo un resumen de los datos. Por lo tanto, las columnas que no forman parte del agrupamiento deben ir acompañadas de una función de agregación.
Funciones más usadas en MySQL
- "COUNT()"
- "SUM()"
- "AVG()"
- "MIN()"
- "MAX()"
Filtrar agregados con WHERE, en lugar de HAVING
Incorrecto
SELECT Departamento, COUNT(*)
FROM Empleados
WHERE COUNT(*) > 5
GROUP BY Departamento;
Correcto
SELECT Departamento, COUNT(*)
FROM Empleados
GROUP BY Departamento
HAVING COUNT(*) > 5;
- "WHERE" se ejecuta antes del "GROUP BY", filtra filas individuales.
- "HAVING" se ejecuta después del "GROUP BY",filtra los grupos ya calculados.
Regla sencilla: WHERE = filas, HAVING = grupos
Agrupar por más columnas de las necesarias
Cuantas más columnas agregues al "GROUP BY", más grupos se obtendrán y menos resumen se tendrá.
Ejemplo
SELECT Año, Mes, Producto, SUM(Ventas) AS Total
FROM Ventas
GROUP BY Año, Mes, Producto;
Si solo se necesita el total por año y mes, quitar "Producto del GROUP BY":
SELECT Año, Mes, SUM(Ventas) AS Total
FROM Ventas
GROUP BY Año, Mes;
Antes de escribir el "GROUP BY", preguntarse: "¿Qué nivel de detalle realmente necesito resumir?"