Retour à la liste des articles Articles
7 minutes de lecture

Comment trier des valeurs dans un ordre spécifique en SQL

Parfois, vous devrez ordonner vos données d'une manière particulière, et souvent l'utilisation des modificateurs de tri typiques comme ASC et DESC ne suffit pas. Cet article vous montrera comment utiliser l'instruction CASE pour ordonner vos données exactement comme vous le souhaitez.

Avez-vous déjà eu besoin d'ordonner vos données d'une manière très spécifique ? L'une des meilleures méthodes pour gérer les tris complexes est d'utiliser CASE. L'instruction CASE est très utile, car elle vous permet d'ajouter une logique if-else à vos requêtes. Nous utiliserons cette logique pour SQL ORDER BY des valeurs spécifiques. Vous pouvez en savoir plus sur l'instruction CASE en lisant cet article qui explique CASE tout en montrant des exemples utiles.

Nous allons démontrer cette commande SQL personnalisée en passant en revue 3 exemples distincts, impliquant différents types de données comme des entiers, des valeurs de texte et des dates.

Pour nos exemples, nous allons utiliser la table orders table. Cette table contient des informations sur les commandes de produits que notre entreprise a reçues.

orders

idlocationcountorder_date
1New York132021-05-21
2Boston212020-11-12
3Chicago42021-03-18
4Toronto102019-12-13
5New York202020-01-27
6Boston332019-04-03
7Memphis72021-05-04
8Cleveland182020-07-06
9Philadelphia62019-04-22
10Washington352021-01-07

Tri personnalisé basé sur une colonne d'entiers

Notre responsable nous a indiqué comment il souhaitait que ces données soient classées. Notre résultat doit respecter les règles suivantes :

  • D'abord, afficher les commandes pour lesquelles entre 10 et 20 articles ont été commandés.
  • Ensuite, afficher les commandes pour lesquelles moins de 10 articles ont été commandés.
  • Enfin, afficher les commandes pour lesquelles plus de 20 articles ont été commandés.

Les exigences sont assez claires, mettons-nous au travail ! Après un certain temps, nous avons produit la requête SQL suivante :

SELECT id, count
FROM orders
ORDER BY CASE WHEN count BETWEEN 10 AND 20 THEN 1
              WHEN count < 10 THEN 2
              ELSE 3END

Décomposons-la.

Nous sélectionnons le site id et le nombre de commandes à afficher. Ensuite, nous entrons directement dans l'ordre de nos résultats en utilisant la clause ORDER BY.

Vous pouvez utiliser CASE pour spécifier une clé de tri dans la clause ORDER BY, ce qui est exactement ce que nous faisons ici. Nous donnons au premier cas une valeur de clé de tri de 1 :

CASE WHEN count BETWEEN 10 AND 20 THEN 1

Nous donnons au deuxième cas une valeur de clé de tri de 2 :

WHEN count < 10 THEN 2

Cela garantit que les résultats du premier cas seront affichés avant ceux du deuxième cas. Les dernières données que nous voulons afficher sont celles où le nombre de commandes est supérieur à 20. Nous pouvons leur attribuer une valeur de clé de tri de 3 : :

ELSE 3

Très bien, exécutons notre requête ! Nous obtenons les enregistrements suivants :

idcount
113
410
520
818
34
77
96
221
633
1035

Ça a marché ! Les articles dont le nombre de commandes est compris entre 10 et 20 sont affichés en premier. Viennent ensuite les commandes où 10 articles ont été commandés. Et enfin, les commandes dont le nombre d'articles est supérieur à 20 sont affichées.

Il s'agit d'une utilisation très avancée de CASE. Vous pouvez également utiliser l'instruction CASE avec des commandes de modification des données telles que INSERT et UPDATE. Consultez cet article de blog sur le sujet si vous souhaitez en savoir plus.

Tri personnalisé basé sur une colonne de texte

Examinons un autre exemple, sauf que cette fois, nous utiliserons une colonne de texte pour spécifier l'ordre dans lequel nos données doivent apparaître.

Notre patron vient de nous dire que nous devons afficher certaines des données de notre table et les trier en fonction du lieu. orders tableau et les trier en fonction du lieu où la commande a été passée.

Ils veulent voir d'abord les commandes de New York, puis celles qui ont eu lieu à Boston, et enfin celles de Toronto. Le reste des données relatives aux commandes doit également être affiché, mais l'ordre n'a pas d'importance pour les autres lieux. Mettons-nous au travail.

Nous sommes arrivés à la requête suivante :

SELECT id, location, count, order_date
FROM orders
ORDER BY CASE WHEN location = 'New York' THEN 1
              WHEN location = 'Boston' THEN 2
              WHEN location = 'Toronto' THEN 3
              ELSE 4 END

Cette fois, nous sélectionnons toutes les colonnes. L'utilisation de ORDER BY et CASE est similaire à notre exemple précédent.Si vous voulez en savoir plus sur ce sujet, consultez cet article qui couvre largement les types de données SQL.

Notez que l'ordre que nous avons utilisé dans notre expression CASE WHEN correspond exactement à nos exigences, montrant New York, Boston, puis Toronto. Exécutons cette requête et voyons si nous avons réussi.

idlocationcountorder_date
1New York132021-05-21
5New York202020-01-27
2Boston212020-11-12
6Boston332019-04-03
4Toronto102019-12-13
3Chicago42021-03-18
8Cleveland182020-07-06
7Memphis72021-05-04
9Philadelphia62019-04-22
10Washington352021-01-07

C'est un succès ! C'est exactement comme cela que nous voulons que nos données soient ordonnées. Nous pouvons maintenant passer à notre dernier exemple. Jusqu'à présent, nous avons travaillé avec des types de données numériques et textuelles.

Tri personnalisé basé sur la colonne Date

Pour notre dernier exemple, nous allons utiliser le type de données date et montrer comment incorporer des valeurs de date dans vos tris personnalisés CASE.

Une autre demande nous est parvenue de notre responsable. Il souhaite que les données soient affichées dans un certain ordre en fonction de la colonne date, order_date. Voici ce qu'on nous a dit :

  • Affichez toutes les commandes de l'année en cours (2021) et triez ces dates par le mois et le jour du mois dans l'ordre croissant.
  • Ensuite, affichez les dates des années précédentes, et triez-les également par le jour et le mois.

Écrivons notre requête et exécutons notre dernier exemple de SQL ORDER BY CASE.

SELECT id, location, count, order_date
FROM orders
ORDER BY 
CASE WHEN EXTRACT(YEAR FROM order_date) = EXTRACT(YEAR FROM CURDATE()) THEN 1
     WHEN EXTRACT(YEAR FROM order_date) = (EXTRACT(YEAR FROM CURDATE()) - 1) THEN 2
     ELSE 3 
END ASC, order_date ASC

Il y a beaucoup de choses à décomposer ici ! Entrons dans le vif du sujet. Examinez l'extrait suivant :

CASE WHEN EXTRACT(YEAR FROM order_date) = EXTRACT(YEAR FROM CURDATE()) THEN 1

EXTRACT est utilisé pour obtenir l'année à partir de la date de la commande. CURDATE() est utilisé pour obtenir la date actuelle. Vous pouvez voir d'autres fonctions comme celles-ci dans ce cours sur les fonctions standard SQL qui vous apprend à traiter des données numériques, textuelles et autres avec les fonctions SQL les plus utilisées.

Nous comparons l'année de order_date à l'année de la date actuelle. Nous faisons apparaître cet ensemble de données en premier en définissant la clé de tri sur 1.

WHEN EXTRACT(YEAR FROM order_date) = (EXTRACT(YEAR FROM CURDATE()) - 1) THEN 2

Cette opération est similaire à la section précédente, sauf que nous utilisons la date de l'année précédente (YEAR FROM CURDATE()) - 1).

Enfin, nous faisons apparaître le reste des résultats à l'aide de cet extrait :

ELSE 3

Cette fois, nous avons également trié par order_date ASC. Cela garantit que les mois et les jours de ce mois sont triés dans l'ordre croissant.

Voyons le résultat de l'exécution de cette requête :

idlocationcountorder_date
10Washington352021-01-07
3Chicago42021-03-18
7Memphis72021-05-04
1New York132021-05-21
5New York202020-01-27
8Cleveland182020-07-06
2Boston212020-11-12
6Boston332019-04-03
9Philadelphia62019-04-22
4Toronto102019-12-13

Nos résultats apparaissent exactement comme nous le souhaitons ! Les dernières années apparaissent en premier, et chaque ensemble de résultats par année est trié par les mois et les jours de cette année.

SQL ORDER BY Valeurs spécifiques

Voilà qui conclut notre examen des tris personnalisés. Nous avons augmenté la complexité de chaque tri au fil des exemples. À ce stade, vous devriez être en mesure d'appliquer les principes de cet article à un problème auquel vous êtes peut-être confronté. Si vous souhaitez voir d'autres exemples, consultez cet article de blog sur le tri d'enregistrements à l'aide de la clause ORDER BY. Il s'agit d'un sujet SQL assez avancé. Pour voir d'autres problèmes SQL avancés, consultez cette piste d'apprentissageSQL avancé de LearnSQL.fr.