Problem:
Du vill hitta grupper av rader där medelvärdet av värden i en kolumn är högre eller lägre än ett givet värde.
Exempel:
Vår databas har en tabell som heter product
med data i följande kolumner:id
, name
, grocery
och price
.
id | namn | livsmedel | pris |
---|---|---|---|
1 | mjölk | Grön butik | 2.34 |
2 | bröd | Clark's Grocery | 3.56 |
3 | bröd | Supermarknad | 4.15 |
4 | mjölk | Supermarknad | 1,80 |
5 | bröd | Mat Amanda | 2.26 |
6 | mjölk | Violett livsmedelsbutik | 3.45 |
7 | mjölk | Clark's Grocery | 2.10 |
8 | bröd | Violett livsmedelsbutik | 2,55 |
9 | mjölk | Mat Amanda | 1,95 |
Låt oss hitta namnen på produkter där det genomsnittliga priset för varje produkt bland dagligvaror är högre än 3,00.
Lösning:
SELECT name, AVG(price) FROM product GROUP BY name HAVING AVG(price)>3.00;
Här är resultatet:
namn | genomsnitt |
---|---|
bröd | 3.13 |
Diskussion:
Om du vill filtrera poster med aggregatfunktionen använder du HAVING-satsen.
Här beräknar vi det sammanlagda värdet:det genomsnittliga priset för varje produkt. En säljs av mer än en livsmedelsbutik; därför beräknas det genomsnittliga priset för varje (i vårt exempel, SELECT name, AVG(price)
). Förutom aggregatfunktionen använder vi även kolumnnamnet i SELECT, så vi bör använda GROUP BY med detta kolumnnamn (GROUP BY name
).
Det sista steget är att använda aggregatfunktionen i HAVING-satsen. Kom ihåg att HAVING ska sättas efter GROUP BY-satsen. Den innehåller villkoret som jämför värdet som returneras av aggregatfunktionen med ett givet värde. Ovan är det genomsnittspriset för produkten med ett värde 3,00 (HAVING AVG(price)>3.00
). I den här frågan kontrollerar vi om det genomsnittliga priset för varje produkt i alla dagligvaror är högre än tre. Frågan visade bara en produkt, bröd, med ett genomsnittspris högre än tre.