Problema:
Debe encontrar filas en las que los grupos tengan una suma de valores en una columna menor que un valor dado.
Ejemplo:
Nuestra base de datos tiene una tabla llamada company
con datos en las siguientes columnas:id
, department
, first_name
, last_name
y salary
.
id | departamento | nombre | apellido | salario |
---|---|---|---|---|
1 | márketing | Lora | Marrón | 2300 |
2 | finanzas | Juan | Jackson | 3200 |
3 | márketing | Miguel | Thomson | 1270 |
4 | producción | Tony | Molinero | 6500 |
5 | producción | Salida | Verde | 2500 |
6 | finanzas | Olivier | Negro | 3450 |
7 | producción | Jenifer | Michelín | 2800 |
8 | márketing | Jeremy | Lorson | 3600 |
9 | márketing | Luis | Smith | 4200 |
Busquemos los nombres de los departamentos que tienen sumas de salarios de sus empleados menores a 7000.
Solución:
SELECT department, SUM(salary) FROM company GROUP BY department HAVING SUM(salary)<7000;
Aquí está el resultado:
departamento | suma |
---|---|
finanzas | 6550 |
Discusión:
Para filtrar registros usando la función de agregado (la función SUM de antes), use la cláusula HAVING. Para calcular la suma de valores para cada grupo de filas, use la función de agregación SUMA. En esta consulta, la columna departamento se calcula con la suma de todos los salarios de sus empleados como grupo (calcularlo con la función SUMA con la columna salario como argumento). Como tú calculas el valor para cada grupo de filas (agrupamos filas según el nombre del departamento), la consulta tiene una cláusula GROUP BY con el nombre de la columna para agrupar filas (en nuestro ejemplo, GROUP BY department
). El último paso es usar la función agregada en la cláusula HAVING. Recuerde, HAVING debe colocarse después de la cláusula GROUP BY. HAVING contiene la condición que compara el valor devuelto por la función agregada con un valor dado. Desde arriba, son las sumas de salarios con un valor inferior a 7000 (SUM(salary)<7000
). Aquí, verificamos que la suma salarial en cada departamento sea inferior a 7000. La consulta mostró solo un departamento, finanzas, con salarios de 6550.