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?"