Problème :
Vous avez regroupé des données dans des groupes, mais vous souhaitez trier les enregistrements par ordre décroissant en fonction du nombre d'éléments dans les groupes.
Exemple :
Notre base de données a une table nommée user
avec des données dans les colonnes suivantes :id
, first_name
, last_name
, et country
.
identifiant | prénom | nom_de_famille | pays |
---|---|---|---|
1 | Lisa | Williams | Angleterre |
2 | Gary | Anders | Pologne |
3 | Tom | Williams | Pologne |
4 | Michel | Marron | France |
5 | Susan | Smith | États-Unis |
6 | Anne | Jones | États-Unis |
7 | Élie | Miller | Pologne |
Créons un rapport sur nos utilisateurs. Nous regrouperons les résultats par country
et compter le nombre d'utilisateurs de chaque pays. Mais nous allons également trier les groupes par ordre décroissant du nombre d'utilisateurs. De cette façon, les pays avec le plus grand nombre d'utilisateurs apparaîtront en haut.
Solution :
SELECT country, COUNT(id) FROM user GROUP BY country ORDER BY COUNT(id) DESC ;
pays | count(id) |
---|---|
Pologne | 3 |
États-Unis | 2 |
Angleterre | 1 |
France | 1 |
Discussion :
Pour trier les enregistrements sélectionnés par le nombre d'éléments dans chaque groupe, vous utilisez le ORDER BY
clause.
La première étape consiste à utiliser le GROUP BY
clause pour créer les groupes (dans notre exemple, nous regroupons par le country
colonne). Ensuite, dans la clause ORDER BY, vous utilisez la fonction d'agrégation COUNT, qui compte le nombre de valeurs dans la colonne de votre choix; dans notre exemple, nous comptons les identifiants distincts avec COUNT(id)
. Cela compte effectivement le nombre d'éléments dans chaque groupe. Le ORDER BY
clause trie ensuite les groupes en fonction de ce calcul.
Comme d'habitude, vous pouvez utiliser l'ordre croissant ou décroissant avec ORDER BY
. Si vous voulez un ordre décroissant (comme dans cet exemple), vous utilisez le DESC
mot-clé. L'ordre croissant n'a pas besoin de mot-clé car c'est la valeur par défaut, mais vous pouvez utiliser le ASC
mot-clé si vous voulez être explicite. C'est le même exemple mais avec les résultats triés par ordre croissant :
Solution :
SELECT country, COUNT(id) FROM user GROUP BY country ORDER BY COUNT(id);
Voici le résultat :
pays | count(id) |
---|---|
Angleterre | 1 |
France | 1 |
États-Unis | 2 |
Pologne | 3 |