Problem:
Du vil gerne sortere rækker efter de summer, der genereres af en gruppe poster.
Eksempel:
Vores database har en tabel med navnet training
med data i fire kolonner:id , login , år , og score .
id | login | år | score |
---|---|---|---|
1 | Andy | 2018 | 24 |
2 | Lucy | 2019 | 25 |
3 | Andy | 2019 | 20 |
4 | Lucy | 2018 | 16 |
5 | Gary | 2019 | 18 |
6 | Gary | 2018 | 19 |
7 | Gary | 2017 | 22 |
8 | Lucy | 2017 | 21 |
9 | Andy | 2017 | 26 |
Lad os få login-navnet på hver spiller sammen med den samlede sum af score for alle år, og sætter rekorder i faldende rækkefølge i henhold til spillernes samlede score.
Løsning:
Vi bruger operatoren ORDER BY til at bestille poster baseret på aggregatfunktionen SUM()
, som beregner den samlede score for hver spiller på tværs af alle år.
Her er den forespørgsel, du ville skrive:
SELECT login, SUM(score) AS total_score FROM training GROUP BY login ORDER BY SUM(score) DESC;
Her er resultatet:
login | total_score |
---|---|
Andy | 70 |
Lucy | 62 |
Gary | 59 |
Diskussion:
Brug ORDER BY, hvis du vil bestille rækker i henhold til en værdi, der returneres af en aggregeret funktion såsom SUM()
. Operatoren ORDER BY efterfølges af aggregatfunktionen (i vores eksempel SUM()
). DESC placeres efter denne funktion for at angive en faldende sorteringsrækkefølge. Således vises de højeste samlede værdier først, derefter vises gradvist lavere værdier. For at sortere i stigende rækkefølge kan du angive ASC eller blot udelade et af søgeordene, da stigende er standardsorteringsrækkefølgen.
I forespørgslen ovenfor vælger vi hver spillers login og summen af deres score for alle år. Denne samlede score beregnes ved hjælp af SUM() med scorekolonnen som argument. Vi tilføjer et alias for denne samlede værdi (SUM(score) AS total_score
); du kan bruge dette alias i stedet for aggregatfunktionen i ORDER BY-sætningen (ORDER BY total_score DESC
).
Bemærk, at vi inkluderer login i GROUP BY. Hvis vi inkluderer en kolonne i SELECT, skal vi også bruge kolonnen i GROUP BY. I dette eksempel bruger vi GROUP BY-sætning efterfulgt af kolonnelogin, fordi vi sætter denne kolonne i SELECT. Bemærk, at GROUP BY er placeret før ORDER BY i forespørgslen.