Database
 sql >> Base de données >  >> RDS >> Database

Comment trier les lignes par somme de groupe en SQL

Problème :

Vous souhaitez trier les lignes en fonction des sommes générées par un groupe d'enregistrements.

Exemple :

Notre base de données contient une table nommée training avec des données sur quatre colonnes :id , se connecter , année , et score .

identifiant se connecter année score
1 Andy 2018 24
2 Lucie 2019 25
3 Andy 2019 20
4 Lucie 2018 16
5 Gary 2019 18
6 Gary 2018 19
7 Gary 2017 22
8 Lucie 2017 21
9 Andy 2017 26

Obtenons le nom de connexion de chaque joueur ainsi que la somme totale des scores sur toutes les années, en classant les enregistrements par ordre décroissant en fonction des scores totaux des joueurs.

Solution :

Nous utiliserons l'opérateur ORDER BY pour trier les enregistrements en fonction de la fonction d'agrégation SUM() , qui calcule le score total de chaque joueur sur toutes les années.

Voici la requête que vous écririez :

SELECT login,
  SUM(score) AS total_score
FROM training
GROUP BY login
ORDER BY SUM(score) DESC;

Voici le résultat :

connexion total_score
Andy 70
Lucie 62
Gary 59

Discussion :

Utilisez ORDER BY si vous souhaitez trier les lignes en fonction d'une valeur renvoyée par une fonction d'agrégation telle que SUM() . L'opérateur ORDER BY est suivi de la fonction d'agrégation (dans notre exemple, SUM() ). DESC est placé après cette fonction pour spécifier un ordre de tri décroissant. Ainsi, les valeurs globales les plus élevées sont affichées en premier, puis les valeurs progressivement inférieures sont affichées. Pour trier dans l'ordre croissant, vous pouvez spécifier ASC ou simplement omettre l'un ou l'autre des mots clés, car l'ordre croissant est l'ordre de tri par défaut.

Dans la requête ci-dessus, nous sélectionnons le login de chaque joueur et la somme de leur score pour toutes les années. Ce score total est calculé à l'aide de SUM() avec la colonne score comme argument. Nous ajoutons un alias pour cette valeur agrégée (SUM(score) AS total_score ); vous pouvez utiliser cet alias à la place de la fonction d'agrégation dans la clause ORDER BY (ORDER BY total_score DESC ).

Notez que nous incluons login dans le GROUP BY. Si nous incluons une colonne dans SELECT, nous devons également utiliser la colonne dans GROUP BY. Dans cet exemple, nous utilisons la clause GROUP BY suivie de la colonne login car nous plaçons cette colonne dans le SELECT. Notez que GROUP BY est placé avant ORDER BY dans la requête.