26th Apr 2022 8 minutes de lecture Comment utiliser CASE WHEN avec SUM() en SQL Tihomir Babic sql apprendre sql group by Table des matières CASE, CASE WHEN, CASE WHEN THEN ou CASE WHEN THEN ELSE ? Comment fonctionne une expression CASE WHEN ? Exemple 1 : l'expression CASE WHEN Exemple 2 : l'expression CASE WHEN avec un SUM() et un GROUP BY Exemple 3 : utilisation d'une expression CASE WHEN avec un SUM() et un GROUP BY Vous commencez à découvrir les possibilités de l'expression CASE WHEN ? 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 ! Tags: sql apprendre sql group by