Problem:
Du samlede data i grupper, men du vil sortere posterne i faldende rækkefølge efter antallet af elementer i grupperne.
Eksempel:
Vores database har en tabel ved navn user
med data i følgende kolonner:id
, first_name
, last_name
og country
.
id | fornavn | efternavn | land |
---|---|---|---|
1 | Lisa | Williams | England |
2 | Gary | Anders | Polen |
3 | Tom | Williams | Polen |
4 | Michael | Brun | Frankrig |
5 | Susan | Smith | USA |
6 | Anne | Jones | USA |
7 | Ellie | Møller | Polen |
Lad os oprette en rapport om vores brugere. Vi grupperer resultaterne efter country
og tæl antallet af brugere fra hvert land. Men vi sorterer også grupperne i faldende rækkefølge efter antal brugere. På den måde vises landene med det største antal brugere øverst.
Løsning:
SELECT country, COUNT(id) FROM user GROUP BY country ORDER BY COUNT(id) DESC ;
land | count(id) |
---|---|
Polen | 3 |
USA | 2 |
England | 1 |
Frankrig | 1 |
Diskussion:
For at sortere de valgte poster efter antallet af elementer i hver gruppe, bruger du ORDER BY
klausul.
Det første trin er at bruge GROUP BY
klausul for at oprette grupperne (i vores eksempel grupperer vi efter country
kolonne). Derefter, i ORDER BY-sætningen, bruger du den samlede funktion COUNT, som tæller antallet af værdier i den kolonne, du ønsker; i vores eksempel tæller vi forskellige id'er med COUNT(id)
. Dette tæller effektivt antallet af elementer i hver gruppe. ORDER BY
klausul sorterer derefter grupperne i henhold til den beregning.
Som sædvanlig kan du bruge både stigende eller faldende rækkefølge med ORDER BY
. Hvis du ønsker faldende rækkefølge (som i dette eksempel), bruger du DESC
søgeord. Stigende rækkefølge behøver ikke noget søgeord, fordi det er standard, men du kan bruge ASC
søgeord, hvis du vil være eksplicit. Dette er det samme eksempel, men med resultater sorteret i stigende rækkefølge:
Løsning:
SELECT country, COUNT(id) FROM user GROUP BY country ORDER BY COUNT(id);
Her er resultatet:
land | count(id) |
---|---|
England | 1 |
Frankrig | 1 |
USA | 2 |
Polen | 3 |