Probleem:
U heeft gegevens samengevoegd in groepen, maar u wilt de records in aflopende volgorde sorteren op het aantal elementen in de groepen.
Voorbeeld:
Onze database heeft een tabel met de naam user
met gegevens in de volgende kolommen:id
, first_name
, last_name
, en country
.
id | voornaam | achternaam | land |
---|---|---|---|
1 | Lisa | Willems | Engeland |
2 | Gary | Anders | Polen |
3 | Tom | Willems | Polen |
4 | Michael | Bruin | Frankrijk |
5 | Susan | Smith | VS |
6 | Anna | Jones | VS |
7 | Ellie | Miller | Polen |
Laten we een rapport maken over onze gebruikers. We groeperen de resultaten op country
en tel het aantal gebruikers van elk land. Maar we sorteren de groepen ook in aflopende volgorde op het aantal gebruikers. Op die manier verschijnen de landen met het grootste aantal gebruikers bovenaan.
Oplossing:
SELECT country, COUNT(id) FROM user GROUP BY country ORDER BY COUNT(id) DESC ;
land | count(id) |
---|---|
Polen | 3 |
VS | 2 |
Engeland | 1 |
Frankrijk | 1 |
Discussie:
Om de geselecteerde records te sorteren op het aantal elementen in elke groep, gebruikt u de ORDER BY
clausule.
De eerste stap is het gebruik van de GROUP BY
clausule om de groepen te maken (in ons voorbeeld groeperen we op country
kolom). Vervolgens gebruikt u in de ORDER BY-component de aggregatiefunctie COUNT, die het aantal waarden in de kolom van uw keuze telt; in ons voorbeeld tellen we verschillende ID's met COUNT(id)
. Dit telt effectief het aantal elementen in elke groep. De ORDER BY
clausule sorteert dan de groepen volgens die berekening.
Zoals gewoonlijk kunt u zowel oplopende als aflopende volgorde gebruiken met ORDER BY
. Als je een aflopende volgorde wilt (zoals in dit voorbeeld), gebruik je de DESC
trefwoord. Oplopende volgorde heeft geen trefwoord nodig omdat dit de standaard is, maar u kunt de ASC
gebruiken trefwoord als u expliciet wilt zijn. Dit is hetzelfde voorbeeld maar met resultaten gesorteerd in oplopende volgorde:
Oplossing:
SELECT country, COUNT(id) FROM user GROUP BY country ORDER BY COUNT(id);
Dit is het resultaat:
land | count(id) |
---|---|
Engeland | 1 |
Frankrijk | 1 |
VS | 2 |
Polen | 3 |