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.