sql >> Base de Datos >  >> RDS >> Database

Cómo filtrar registros con la función de agregado SUMA

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.