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.