Problema:
Você deseja encontrar grupos de linhas em que a média dos valores em uma coluna seja maior ou menor que um determinado valor.
Exemplo:
Nosso banco de dados tem uma tabela chamada
product
com dados nas seguintes colunas:id
, name
, grocery
e price
. id | nome | mercearia | preço |
---|---|---|---|
1 | leite | Loja Verde | 2,34 |
2 | pão | Mercearia do Clark | 3,56 |
3 | pão | Supermercado | 4.15 |
4 | leite | Supermercado | 1,80 |
5 | pão | Mantimento Amanda | 2,26 |
6 | leite | Mercearia Violeta | 3,45 |
7 | leite | Mercearia do Clark | 2.10 |
8 | pão | Mercearia Violeta | 2,55 |
9 | leite | Mantimento Amanda | 1,95 |
Vamos encontrar os nomes dos produtos em que o preço médio de cada produto entre os mantimentos é superior a 3,00.
Solução:
SELECT name, AVG(price) FROM product GROUP BY name HAVING AVG(price)>3.00;
Aqui está o resultado:
nome | média |
---|---|
pão | 3.13 |
Discussão:
Para filtrar registros usando a função de agregação, use a cláusula HAVING.
Aqui calculamos o valor agregado:o preço médio de cada produto. Um é vendido por mais de um merceeiro; portanto, o preço médio é calculado para cada um (no nosso exemplo,
SELECT name, AVG(price)
). Além da função de agregação, também usamos o nome da coluna em SELECT, então devemos usar GROUP BY com este nome de coluna (GROUP BY name
). A última etapa é usar a função agregada na cláusula HAVING. Lembre-se que HAVING deve ser colocado após a cláusula GROUP BY. Ele contém a condição que compara o valor retornado pela função agregada com um determinado valor. Acima, é o preço médio do produto com valor 3,00 (
HAVING AVG(price)>3.00
). Nesta consulta, verificamos se o preço médio de cada produto em todas as compras é superior a três. A consulta apresentou apenas um produto, pão, com preço médio superior a três.