Probleem:
U wilt rijen rangschikken op basis van de sommen die zijn gegenereerd door een groep records.
Voorbeeld:
Onze database heeft een tabel met de naam training
met gegevens in vier kolommen:id , aanmelden , jaar , en score .
id | inloggen | jaar | 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 |
Laten we de inlognaam van elke speler krijgen, samen met de totale som van de score over alle jaren, en de records in aflopende volgorde plaatsen op basis van de totale scores van de spelers.
Oplossing:
We gebruiken de operator ORDER BY om records te ordenen op basis van de aggregatiefunctie SUM()
, die de totale score voor elke speler over alle jaren berekent.
Dit is de vraag die je zou schrijven:
SELECT login, SUM(score) AS total_score FROM training GROUP BY login ORDER BY SUM(score) DESC;
Dit is het resultaat:
inloggen | total_score |
---|---|
Andy | 70 |
Lucy | 62 |
Gary | 59 |
Discussie:
Gebruik ORDER BY als u rijen wilt ordenen op basis van een waarde die wordt geretourneerd door een aggregatiefunctie zoals SUM()
. De ORDER BY-operator wordt gevolgd door de aggregatiefunctie (in ons voorbeeld SUM()
). DESC wordt na deze functie geplaatst om een aflopende sorteervolgorde te specificeren. De hoogste totaalwaarden worden dus eerst weergegeven, daarna worden geleidelijk lagere waarden weergegeven. Om in oplopende volgorde te sorteren, kunt u ASC specificeren of gewoon een van de trefwoorden weglaten, aangezien oplopend de standaard sorteervolgorde is.
In de bovenstaande zoekopdracht selecteren we de login van elke speler en de som van hun score voor alle jaren. Deze totale score wordt berekend met SUM() met de scorekolom als argument. We voegen een alias toe voor deze totale waarde (SUM(score) AS total_score
); u kunt deze alias gebruiken in plaats van de aggregatiefunctie in de ORDER BY-clausule (ORDER BY total_score DESC
).
Merk op dat we login . opnemen in de GROUP-BY. Als we een kolom in SELECT opnemen, moeten we ook de kolom in GROUP BY gebruiken. In dit voorbeeld gebruiken we de GROUP BY-component gevolgd door de kolom login omdat we deze kolom in de SELECT. Merk op dat GROUP BY vóór ORDER BY wordt geplaatst in de zoekopdracht.