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.