Problem:
Du vil finde grupper af rækker, hvor gennemsnittet af værdier i en kolonne er højere eller lavere end en given værdi.
Eksempel:
Vores database har en tabel med navnet product
med data i følgende kolonner:id
, name
, grocery
og price
.
id | navn | købmand | pris |
---|---|---|---|
1 | mælk | Grøn butik | 2.34 |
2 | brød | Clarks købmand | 3,56 |
3 | brød | Supermarked | 4.15 |
4 | mælk | Supermarked | 1,80 |
5 | brød | Købmand Amanda | 2.26 |
6 | mælk | Violet købmand | 3,45 |
7 | mælk | Clarks købmand | 2.10 |
8 | brød | Violet købmand | 2,55 |
9 | mælk | Købmand Amanda | 1,95 |
Lad os finde navnene på produkter, hvor gennemsnitsprisen for hvert produkt blandt dagligvarer er højere end 3,00.
Løsning:
SELECT name, AVG(price) FROM product GROUP BY name HAVING AVG(price)>3.00;
Her er resultatet:
navn | gennemsnit |
---|---|
brød | 3.13 |
Diskussion:
For at filtrere poster ved hjælp af aggregeringsfunktionen skal du bruge HAVING-udtrykket.
Her beregner vi den samlede værdi:gennemsnitsprisen for hvert produkt. Den ene sælges af mere end én købmand; derfor beregnes gennemsnitsprisen for hver (i vores eksempel SELECT name, AVG(price)
). Udover aggregatfunktionen bruger vi også kolonnenavnet i SELECT, så vi bør bruge GROUP BY med dette kolonnenavn (GROUP BY name
).
Det sidste trin er at bruge aggregatfunktionen i HAVING-sætningen. Husk at HAVING skal stå efter GROUP BY-sætningen. Den indeholder betingelsen, som sammenligner den værdi, der returneres af den aggregerede funktion, med en given værdi. Ovenfor er det gennemsnitsprisen på produktet med en værdi på 3,00 (HAVING AVG(price)>3.00
). I denne forespørgsel tjekker vi, om den gennemsnitlige pris for hvert produkt i alle dagligvarer er højere end tre. Forespørgslen viste kun ét produkt, brød, med en gennemsnitspris højere end tre.