Problema:
Você precisa encontrar linhas em que os grupos tenham uma soma de valores em uma coluna menor que um determinado valor.
Exemplo:
Nosso banco de dados tem uma tabela chamada
company com dados nas seguintes colunas:id , department , first_name , last_name e salary . | id | departamento | first_name | last_name | salário |
|---|---|---|---|---|
| 1 | marketing | Lora | Marrom | 2300 |
| 2 | finanças | João | Jackson | 3200 |
| 3 | marketing | Michael | Thomson | 1270 |
| 4 | produção | Tony | Moleiro | 6500 |
| 5 | produção | Sally | Verde | 2500 |
| 6 | finanças | Olivier | Preto | 3450 |
| 7 | produção | Jennifer | Michelin | 2800 |
| 8 | marketing | Jeremy | Lorson | 3600 |
| 9 | marketing | Luís | Smith | 4200 |
Vamos encontrar os nomes dos departamentos que têm somas de salários de seus funcionários inferiores a 7.000.
Solução:
SELECT department, SUM(salary) FROM company GROUP BY department HAVING SUM(salary)<7000;
Aqui está o resultado:
| departamento | soma |
|---|---|
| finanças | 6550 |
Discussão:
Para filtrar registros usando a função agregada (a função SUM anterior), use a cláusula HAVING. Para calcular a soma dos valores para cada grupo de linhas, use a função de agregação SUM. Nesta consulta, a coluna departamento é calculada com a soma de todos os salários de seus funcionários como um grupo (calcule-o com a função SOMA com a coluna salário como argumento). Como você calcula o valor para cada grupo de linhas (agrupamos as linhas de acordo com o nome do departamento), a consulta possui uma cláusula GROUP BY com o nome da coluna para agrupar as linhas (no nosso exemplo,
GROUP BY department ). A última etapa é usar a função agregada na cláusula HAVING. Lembre-se, HAVING deve ser colocado após a cláusula GROUP BY. HAVING contém a condição que compara o valor retornado pela função agregada com um determinado valor. De cima, são as somas salariais com valor inferior a 7000 (SUM(salary)<7000 ). Aqui, verificamos que a soma salarial em cada departamento é inferior a 7.000. A consulta exibiu apenas um departamento, financeiro, com salários de 6.550.