Problem:
Du skal finde rækker, hvor grupper har en sum af værdier i én kolonne, der er mindre end en given værdi.
Eksempel:
Vores database har en tabel ved navn company
med data i følgende kolonner:id
, department
, first_name
, last_name
og salary
.
id | afdeling | fornavn | efternavn | løn |
---|---|---|---|---|
1 | markedsføring | Lora | Brun | 2300 |
2 | finans | John | Jackson | 3200 |
3 | markedsføring | Michael | Thomson | 1270 |
4 | produktion | Tony | Møller | 6500 |
5 | produktion | Sally | Grøn | 2500 |
6 | finans | Olivier | Sort | 3450 |
7 | produktion | Jeniffer | Michelin | 2800 |
8 | markedsføring | Jeremy | Lorson | 3600 |
9 | markedsføring | Louis | Smith | 4200 |
Lad os finde navnene på afdelinger, der har lønsum for sine ansatte på under 7000.
Løsning:
SELECT department, SUM(salary) FROM company GROUP BY department HAVING SUM(salary)<7000;
Her er resultatet:
afdeling | sum |
---|---|
finans | 6550 |
Diskussion:
For at filtrere poster ved hjælp af aggregatfunktionen (funktionen SUM fra tidligere), skal du bruge HAVING-udtrykket. For at beregne summen af værdier for hver gruppe af rækker skal du bruge funktionen aggregering SUM. I denne forespørgsel beregnes kolonneafdelingen med summen af alle lønninger for dens ansatte som en gruppe (beregn den med SUM-funktionen med kolonneløn som argument). Fordi du beregner værdien for hver gruppe af rækker (vi grupperer rækker efter afdelingens navn), har forespørgslen en GROUP BY-sætning med navnet på kolonnen for at gruppere rækker (i vores eksempel, GROUP BY department
). Det sidste trin er at bruge aggregatfunktionen i HAVING-sætningen. Husk, at HAVING skal stå efter GROUP BY-sætning. HAVING indeholder betingelsen, der sammenligner den værdi, der returneres af den aggregerede funktion, med en given værdi. Fra oven er det lønsum med en værdi mindre end 7000 (SUM(salary)<7000
). Her bekræfter vi, at lønsummen i hver afdeling er lavere end 7000. Forespørgslen viste kun én afdeling, økonomi, med lønninger på 6550.