Probleem:
U wilt groepen rijen zoeken waarin het gemiddelde van de waarden in een kolom hoger of lager is dan een bepaalde waarde.
Voorbeeld:
Onze database heeft een tabel met de naam product
met gegevens in de volgende kolommen:id
, name
, grocery
en price
.
id | naam | boodschappen | prijs |
---|---|---|---|
1 | melk | Groene winkel | 2.34 |
2 | brood | Clark's Grocery | 3.56 |
3 | brood | Supermarkt | 4.15 |
4 | melk | Supermarkt | 1.80 |
5 | brood | Kruidenierswinkel Amanda | 2.26 |
6 | melk | Violet Kruidenier | 3,45 |
7 | melk | Clark's Grocery | 2.10 |
8 | brood | Violet Kruidenier | 2.55 |
9 | melk | Kruidenierswinkel Amanda | 1,95 |
Laten we de namen zoeken van producten waarin de gemiddelde prijs van elk product onder de boodschappen hoger is dan 3,00.
Oplossing:
SELECT name, AVG(price) FROM product GROUP BY name HAVING AVG(price)>3.00;
Dit is het resultaat:
naam | gem |
---|---|
brood | 3.13 |
Discussie:
Gebruik de HAVING-component om records te filteren met behulp van de aggregatiefunctie.
Hier berekenen we de totale waarde:de gemiddelde prijs van elk product. Eén wordt door meer dan één kruidenier verkocht; daarom wordt voor elk de gemiddelde prijs berekend (in ons voorbeeld SELECT name, AVG(price)
). Naast de aggregatiefunctie gebruiken we ook de kolomnaam in SELECT, dus we moeten GROUP BY gebruiken met deze kolomnaam (GROUP BY name
).
De laatste stap is het gebruik van de aggregatiefunctie in de HAVING-clausule. Onthoud dat HAVING achter de GROUP BY-clausule moet worden geplaatst. Het bevat de voorwaarde die de door de aggregatiefunctie geretourneerde waarde vergelijkt met een bepaalde waarde. Hierboven is dit de gemiddelde prijs van het product met een waarde van 3,00 (HAVING AVG(price)>3.00
). In deze zoekopdracht controleren we of de gemiddelde prijs van elk product in alle boodschappen hoger is dan drie. De zoekopdracht toonde slechts één product, brood, met een gemiddelde prijs hoger dan drie.