Problem:
Du måste hitta rader där grupper har en summa av värden i en kolumn som är mindre än ett givet värde.
Exempel:
Vår databas har en tabell som heter company
med data i följande kolumner:id
, department
, first_name
, last_name
och salary
.
id | avdelning | förnamn | efternamn | lön |
---|---|---|---|---|
1 | marknadsföring | Lora | Brun | 2300 |
2 | ekonomi | John | Jackson | 3200 |
3 | marknadsföring | Michael | Thomson | 1270 |
4 | produktion | Tony | Miller | 6500 |
5 | produktion | Sally | Grön | 2500 |
6 | ekonomi | Olivier | Svart | 3450 |
7 | produktion | Jeniffer | Michelin | 2800 |
8 | marknadsföring | Jeremy | Lorson | 3600 |
9 | marknadsföring | Louis | Smith | 4200 |
Låt oss ta reda på namnen på avdelningar som har lönesummor för sina anställda mindre än 7 000.
Lösning:
SELECT department, SUM(salary) FROM company GROUP BY department HAVING SUM(salary)<7000;
Här är resultatet:
avdelning | summa |
---|---|
ekonomi | 6550 |
Diskussion:
För att filtrera poster med aggregatfunktionen (funktionen SUM från tidigare), använd HAVING-satsen. För att beräkna summan av värden för varje grupp av rader, använd funktionen aggregering SUMMA. I den här frågan beräknas kolumnavdelningen med summan av alla löner för sina anställda som grupp (beräkna den med SUM-funktionen med kolumnen lön som argument). Eftersom du beräknar värdet för varje grupp av rader (vi grupperar rader efter namnet på avdelningen), har frågan en GROUP BY-sats med namnet på kolumnen för att gruppera rader (i vårt exempel, GROUP BY department
). Det sista steget är att använda aggregatfunktionen i HAVING-satsen. Kom ihåg att HAVING ska sättas efter GROUP BY-satsen. HAVING innehåller villkoret som jämför värdet som returneras av aggregatfunktionen med ett givet värde. Ovanifrån är det lönesummor med ett värde mindre än 7000 (SUM(salary)<7000
). Här verifierar vi att lönesumman i varje avdelning är lägre än 7000. Frågan visade endast en avdelning, ekonomi, med löner på 6550.