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.