Probleem:
U moet rijen vinden waarin groepen een som van waarden in één kolom hebben die kleiner zijn dan een bepaalde waarde.
Voorbeeld:
Onze database heeft een tabel met de naam company
met gegevens in de volgende kolommen:id
, department
, first_name
, last_name
, en salary
.
id | afdeling | voornaam | achternaam | salaris |
---|---|---|---|---|
1 | marketing | Lora | Bruin | 2300 |
2 | financiën | Jan | Jackson | 3200 |
3 | marketing | Michael | Thomson | 1270 |
4 | productie | Tony | Miller | 6500 |
5 | productie | Sally | Groen | 2500 |
6 | financiën | Olivier | Zwart | 3450 |
7 | productie | Jeniffer | Michelin | 2800 |
8 | marketing | Jeremy | Lorson | 3600 |
9 | marketing | Louis | Smith | 4200 |
Laten we de namen zoeken van afdelingen die een salaris van minder dan 7000 werknemers hebben.
Oplossing:
SELECT department, SUM(salary) FROM company GROUP BY department HAVING SUM(salary)<7000;
Dit is het resultaat:
afdeling | som |
---|---|
financiën | 6550 |
Discussie:
Gebruik de HAVING-component om records te filteren met de aggregatiefunctie (de functie SUM van eerder). Gebruik de aggregatiefunctie SOM om de som van de waarden voor elke groep rijen te berekenen. In deze query wordt de kolom afdeling berekend met de som van alle salarissen van zijn medewerkers als groep (bereken deze met de functie SOM met de kolom salaris als argument). Omdat u de waarde voor elke groep rijen berekent (we groeperen rijen op basis van de naam van de afdeling), heeft de query een GROUP BY-clausule met de naam van de kolom om rijen te groeperen (in ons voorbeeld GROUP BY department
). De laatste stap is het gebruik van de aggregatiefunctie in de HAVING-clausule. Onthoud dat HAVING achter de GROUP BY-clausule moet worden geplaatst. HAVING bevat de voorwaarde die de waarde vergelijkt die wordt geretourneerd door de aggregatiefunctie met een bepaalde waarde. Van bovenaf zijn het de salarissommen met een waarde kleiner dan 7000 (SUM(salary)<7000
). Hier controleren we of het salarisbedrag in elke afdeling lager is dan 7000. De zoekopdracht toonde slechts één afdeling, financiën, met salarissen van 6550.