Retour à la liste des articles Articles
8 minutes de lecture

Comment utiliser CASE WHEN avec SUM() en SQL

Cet article vous apprendra ce qu'est une expression CASE WHEN en SQL et comment l'utiliser avec la fonction SUM() et une instruction GROUP BY. Les exemples sont inclus pour renforcer votre compréhension.

Savoir comment utiliser une expression CASE WHEN en SQL permet de mieux comprendre les possibilités passionnantes de SQL. Elle vous permet de passer du statut de simple utilisateur dépendant des résultats de SQL à celui d'un utilisateur qui maîtrise mieux le langage et qui définit des critères spécifiques dans SQL. Combinée à d'autres fonctions et instructions, telles que SUM() et GROUP BY, l'expression CASE WHEN est un outil puissant pour créer des rapports SQL complexes.

Vous pouvez découvrir CASE WHEN et son utilisation avec SUM() et GROUP BY dans notre cours pratique, Création de rapports basiques en SQL. Pour plus de pratique du SQL, consultez notre cours, La pratique du SQL avec plus de 500 exercices interactifs.

CASE, CASE WHEN, CASE WHEN THEN ou CASE WHEN THEN ELSE ?

Au sens strict, on l'appelle une instruction CASE en SQL. Parfois, on l'appelle une expression CASE WHEN ou l'une des autres que j'ai mentionnées ci-dessus. Ne vous y trompez pas, c'est du pareil au même. Les clauses WHEN, THEN, et ELSE font toutes partie de l'instruction CASE.

Comment fonctionne une expression CASE WHEN ?

Vous pouvez la considérer comme l'équivalent SQL de la construction IF-THEN-ELSE. Il se peut que vous soyez déjà familiarisé avec cette expression, notamment si vous l'avez utilisée dans Excel ou dans un autre langage de programmation. Quoi qu'il en soit, passons-la en revue ici.

La construction IF-THEN-ELSE se présente comme suit. L'instruction IF exécute un test logique ; elle vérifie si une expression spécifique est vraie ou fausse. Si l'expression est vraie, elle attribue alors une certaine valeur que vous spécifiez ; sinon, elle attribue une valeur différente que vous spécifiez également.

La structure de l'expression CASE WHEN est la même. Elle exécute un test logique ; dans le cas où l'expression est vraie, elle lui attribuera une valeur spécifique. Dans le cas contraire, elle lui attribue une valeur différente.

Laissez-moi vous montrer la logique et la syntaxe de CASE WHEN dans un exemple.

Exemple 1 : l'expression CASE WHEN

Nous disposons d'une table nommée test_result qui contient les résultats des tests. Les colonnes sont les suivantes :

  • id: l'ID de l'étudiant.
  • first_name: le prénom de l'étudiant.
  • last_name: le nom de famille de l'étudiant.
  • score: le résultat du test.

La tâche consiste à attribuer des catégories de résultats de test en fonction du score. Voici comment procéder :

SELECT	
  first_name,
  last_name,
  score,
  CASE
    WHEN score > 90 THEN 'Exceptional result'
    WHEN score > 70 THEN 'Great result'
    WHEN score > 50 THEN 'Average result'
    ELSE 'Poor result'
  END AS score_category
FROM test_result
ORDER BY score DESC;

L'instruction SELECT sélectionne le prénom et le nom des étudiants ainsi que leurs résultats dans la table test_result ; rien d'inhabituel ici. Mais c'est là que commence la partie amusante ! L'instruction CASE commence par le mot-clé CASE, naturellement. Ensuite, je définis les conditions à vérifier par l'instruction CASE et les valeurs à attribuer ; pour ce faire, j'utilise WHEN et THEN. Par exemple, si le score est supérieur à 90, il est classé dans la catégorie "Résultat exceptionnel". S'il est supérieur à 70, il s'agit d'un "Résultat exceptionnel". Il n'est pas nécessaire d'indiquer explicitement "et moins de 90" ; SQL prend en compte d'autres conditions pour éviter les résultats en double ou les erreurs.

En suivant la même logique, tout score supérieur à 50 est considéré comme un "résultat moyen". Tout score ne remplissant pas l'une des trois conditions ci-dessus est considéré comme un "Résultat médiocre". N'oubliez pas qu'ELSE est utilisé pour attribuer la valeur lorsqu'aucune des conditions définies par CASE et WHEN n'est remplie.

Une déclaration CASE se termine par une déclaration END. Ensuite, vous pouvez définir le nom de la colonne dans laquelle les résultats de votre déclaration CASE seront stockés ; dans ce cas, il s'agit de la colonne score_category. J'ai également classé les résultats dans l'ordre décroissant de la colonne score. Je suis sûr que vous voulez voir le résultat :

first_namelast_namescorescore_category
BenoitShaughnessy95Exceptional result
LudvigPert92Exceptional result
GizelaShimmings73Great result
CapriceKilshall70Average result
ColinWhinney40Poor result
EtienneMcClaren36Poor result
MistiChazelas32Poor result
ShurlockeGallaccio29Poor result
FreddyBelverstone16Poor result
MariannMariot8Poor result

Notez qu'une condition ELSE n'est pas obligatoire dans une déclaration CASE. Essayons de l'omettre. Voici le même code que le précédent, mais sans la condition ELSE:

SELECT	
  first_name,
  last_name,
  score,
  CASE
    WHEN score > 90 THEN 'Exceptional result'
    WHEN score > 70 THEN 'Great result'
    WHEN score > 50 THEN 'Average result'
  END AS score_category
FROM test_result
ORDER BY score DESC;

Exécutez le code et examinez son résultat :

first_namelast_namescorescore_category
BenoitShaughnessy95Exceptional result
LudvigPert92Exceptional result
GizelaShimmings73Great result
CapriceKilshall70Average result
ColinWhinney40NULL
EtienneMcClaren36NULL
MistiChazelas32NULL
ShurlockeGallaccio29NULL
FreddyBelverstone16NULL
MariannMariot8NULL

Le code s'est exécuté sans erreur, mais le résultat est différent. Il n'y a plus de catégorie "Résultat médiocre". Au lieu de cela, il y a des valeurs NULL. N'oubliez pas : lorsque les lignes ne correspondent à aucune des conditions définies, l'instruction CASE renvoie les valeurs NULL.

Si vous souhaitez approfondir la syntaxe, cet article très complet sur la logique CASE WHEN peut vous être utile.

Exemple 2 : l'expression CASE WHEN avec un SUM() et un GROUP BY

Passons aux choses sérieuses ! Une expression CASE WHEN est souvent utilisée avec une fonction SUM() dans des rapports plus complexes, ce qui peut être assez difficile pour les débutants. Même si vous avez probablement l'habitude d'utiliser la fonction SUM() pour additionner des valeurs, elle peut également être utilisée pour compter.

Cet exemple vous aidera à mieux comprendre le concept. Je vais utiliser la table subject qui possède les colonnes suivantes :

Les données suivantes sont disponibles :

  • id : l'ID du sujet.
  • name : le nom de la matière.
  • number_of_lectures : le nombre de cours dans l'année.
  • department : le département où la matière est enseignée.

La tâche consiste, à compter le nombre de matières obligatoires et facultatives par département. Dans cet exemple, chaque matière qui a plus de 20 cours pendant l'année est considérée comme obligatoire. Savez-vous comment résoudre cette tâche ? Laissez-moi vous aider :

SELECT	
  department,
  SUM (CASE
    WHEN number_of_lectures > 20 THEN 1
    ELSE 0
  END) AS mandatory_subjects,
  SUM (CASE
    WHEN number_of_lectures <= 20 THEN 1
    ELSE 0
  END) AS elective_subjects
FROM subject
GROUP BY department;

Analysons le code ! Pour commencer, il sélectionne la colonne département dans la table subject. Puis vient l'utilisation curieuse d'un SUM() avec un CASE WHEN. Cette expression dit que si le number_of_lectures est supérieur à 20, la valeur 1 est attribuée à la ligne. Si la condition n'est pas remplie, la valeur attribuée est 0.

La fonction SUM() additionne toutes les lignes dont la valeur assignée est égale à 1. Réfléchissez un instant : si vous additionnez tous les 1, qu'obtiendrez-vous ? Exactement la même chose que si vous aviez compté les lignes dont number_of_lectures est supérieur à 20. L'utilisation d'une expression CASE WHEN pour attribuer les valeurs 0 ou 1 aux lignes de la table n'est qu'une petite astuce pour que SUM() renvoie le nombre de lignes comme le ferait la fonction COUNT(). Le numéro du sujet ayant plus de 20 cours sera affiché dans la colonne mandatory_subjects.

La même logique s'applique à l'expression suivante CASE WHEN. La seule différence est que la condition fait référence à 20 conférences ou moins, le résultat étant affiché dans la colonne elective_subjects.

Enfin, le résultat de la requête est regroupé par la colonne département. Voici le résultat de cette requête :

departmentmandatory_subjectselective_subjects
Economics21
Literature20
Philosophy22

Si vous avez des difficultés avec GROUP BY, cet article, qui explique sa logique est toujours utile. Et si vous recherchez de bons exemples, voici un article qui vous donne cinq exemples de GROUP BY.

Laissez-moi vous montrer un autre exemple de l'expression CASE WHEN. On dit que c'est en forgeant qu'on devient forgeron. Eh bien, ce n'est pas tout à fait vrai ; la perfection n'existe pas ! Vous ne deviendrez peut-être pas parfait, mais la pratique vous permettra certainement de mieux écrire votre code.

Exemple 3 : utilisation d'une expression CASE WHEN avec un SUM() et un GROUP BY

Dans ce dernier exemple, je vais utiliser le tableau orders. Il contient les colonnes suivantes :

  • id : l'ID de la commande.
  • total_price :le prix total de la commande.
  • order_date : la date de la commande.
  • status : le statut de la commande.
  • ship_country : le pays dans lequel la commande doit être expédiée.

Votre tâche est d'afficher le nombre de commandes expédiées par pays. La commande est expédiée si son statut est "expédié" ou "livré". Ce code vous permettra d'obtenir le résultat souhaité :

SELECT 
  ship_country,
  SUM(CASE
    WHEN status = 'shipped' OR status = 'delivered' THEN 1
    ELSE 0
  END) AS order_shipped
FROM orders
GROUP BY ship_country;

Le code sélectionne la colonne ship_country dans le tableau. orders. Il utilise ensuite une expression CASE WHEN pour attribuer la valeur 1 à toutes les lignes dont le statut est "expédié" ou "livré". Tous les autres statuts se verront attribuer la valeur 0. La nouvelle colonne est nommée order_shipped. Enfin, le résultat est groupé par la colonne ship_country. Voici le résultat :

ship_countryorder_shipped
Netherlands2
Poland1
Spain4

Si vous souhaitez utiliser la fonction SUM() de manière plus conventionnelle, voici un article qui vous aidera à l'utiliser pour la sommation conditionnelle.

Vous commencez à découvrir les possibilités de l'expression CASE WHEN ?

J'espère que cet article vous a aidé à comprendre l'expression CASE WHEN en général en abordant sa logique et en vous montrant des exemples de son fonctionnement. L'utilisation des expressions CASE WHEN peut réellement débloquer les possibilités de SQL. Elle est encore plus puissante lorsqu'elle est combinée à des fonctions d'agrégation telles que SUM(), que j'ai montrées dans deux exemples.

Vous pouvez en apprendre encore plus dans le cours Création de rapports basiques en SQL. Découvrez ce cours dans un épisode de notre série Le cours du mois. Pour plus de pratique du SQL, consultez notre cours, La pratique du SQL. Il contient plus de 500 exercices SQL et nous continuons à en ajouter !