Data Analyst

CASE WHEN en SQL : créer des catégories métier

Transformez une règle métier en colonne lisible sans modifier les données sources.

Équipe SQL.tn11 min
Requête SQL utilisant CASE WHEN pour classer des lignes de données

CASE WHEN traduit une règle en valeur

Un rapport doit souvent regrouper des valeurs brutes dans des catégories compréhensibles : petite, moyenne ou grande commande ; client actif ou inactif ; objectif atteint ou non.

L’expression CASE évalue les conditions dans l’ordre et retourne la valeur associée à la première condition vraie. Elle crée une colonne de résultat sans modifier la table source.

Les règles et montants utilisés ici sont des exemples pédagogiques. Un seuil réel doit être défini avec les responsables du métier concerné.

La syntaxe complète de CASE WHEN

Chaque branche commence par WHEN, décrit une condition, puis indique le résultat après THEN. ELSE couvre tous les cas restants et END ferme l’expression.

Un alias placé après END donne un nom exploitable à la nouvelle colonne.

  • CASE commence l’expression.
  • WHEN définit une condition.
  • THEN fournit le résultat correspondant.
  • ELSE traite les autres lignes.
  • END ferme l’expression.
Classer les commandes par montant
SELECT
  id_commande,
  montant,
  CASE
    WHEN montant >= 150 THEN 'Élevée'
    WHEN montant >= 50 THEN 'Moyenne'
    ELSE 'Faible'
  END AS tranche_montant
FROM commandes
ORDER BY id_commande ASC;

L’ordre des conditions détermine le résultat

CASE s’arrête à la première condition vraie. Les seuils doivent donc être écrits du plus restrictif au plus large dans cet exemple.

Si montant >= 50 apparaissait avant montant >= 150, une commande de 200 satisferait immédiatement la première branche et serait classée « Moyenne ».

Ordre correct des seuils
CASE
  WHEN montant >= 150 THEN 'Élevée'
  WHEN montant >= 50 THEN 'Moyenne'
  ELSE 'Faible'
END
Testez toujours les valeurs aux frontières : 49,99 ; 50 ; 149,99 et 150 dans cet exemple.

Que se passe-t-il sans ELSE ?

Lorsque aucune condition n’est vraie et qu’aucun ELSE n’est présent, CASE retourne NULL. Ce comportement peut être volontaire, mais il doit être anticipé dans les filtres et agrégations suivantes.

Ajouter ELSE rend souvent la règle plus facile à vérifier. Un libellé comme « Non classé » révèle aussi les valeurs qui n’entrent dans aucune catégorie attendue.

Signaler un statut inattendu
SELECT
  id_commande,
  CASE
    WHEN statut = 'Payée' THEN 'Terminée'
    WHEN statut = 'En attente' THEN 'À traiter'
    ELSE 'À vérifier'
  END AS suivi
FROM commandes;

Construire un KPI avec une agrégation conditionnelle

CASE peut retourner 1 lorsque la condition est vraie et 0 dans les autres cas. SUM additionne ensuite ces indicateurs pour compter les lignes qui respectent la règle.

Cette technique permet de calculer plusieurs KPI sur une seule ligne et un seul périmètre, sans multiplier les requêtes.

  • COUNT(*) donne le volume total.
  • Chaque CASE produit un indicateur 0 ou 1.
  • SUM transforme ces indicateurs en compteurs.
Compter les commandes par état
SELECT
  COUNT(*) AS nombre_commandes,
  SUM(CASE WHEN statut = 'Payée' THEN 1 ELSE 0 END) AS commandes_payees,
  SUM(CASE WHEN statut = 'En attente' THEN 1 ELSE 0 END) AS commandes_en_attente
FROM commandes;

Regrouper les résultats par segment calculé

Une expression CASE peut servir de dimension dans un rapport. En la regroupant, vous obtenez une ligne par tranche accompagnée d’un volume, d’un total ou d’une moyenne.

Selon le moteur SQL, l’alias n’est pas toujours accepté dans GROUP BY. Répéter l’expression reste une solution explicite et portable.

Chiffre d’affaires par tranche
SELECT
  CASE
    WHEN montant >= 150 THEN 'Élevée'
    WHEN montant >= 50 THEN 'Moyenne'
    ELSE 'Faible'
  END AS tranche_montant,
  COUNT(*) AS nombre_commandes,
  SUM(montant) AS chiffre_affaires
FROM commandes
GROUP BY
  CASE
    WHEN montant >= 150 THEN 'Élevée'
    WHEN montant >= 50 THEN 'Moyenne'
    ELSE 'Faible'
  END
ORDER BY chiffre_affaires DESC;

CASE ne remplace pas toujours WHERE

Utilisez WHERE lorsque le besoin consiste simplement à retirer des lignes. CASE est plus adapté lorsqu’il faut produire une valeur différente selon la ligne ou calculer plusieurs indicateurs conditionnels.

Une expression CASE inutilement imbriquée rend la règle difficile à relire. Préférez plusieurs branches simples et des noms de catégories sans ambiguïté.

  • WHERE sélectionne un périmètre.
  • CASE classe ou transforme une valeur.
  • CASE dans SUM ou COUNT construit un indicateur conditionnel.
  • Une table de référence devient préférable lorsque les règles sont nombreuses et changent souvent.

Vérifier une règle CASE avant de la publier

Listez les catégories attendues, testez chaque seuil exact et contrôlez les valeurs NULL. Comparez ensuite le total des segments au nombre de lignes du périmètre.

Les erreurs les plus fréquentes sont des conditions dans le mauvais ordre, un ELSE manquant, des résultats de types incompatibles ou des seuils qui laissent un intervalle non couvert.

Une requête peut être valide tout en appliquant une règle métier incorrecte. Faites relire les seuils, pas seulement la syntaxe SQL.

À vous d’écrire la requête.

Vérifiez SELECT et FROM sur un exercice gratuit avant de poursuivre.

Ouvrir l’exercice
CASE WHEN en SQL : syntaxe et exemples pratiques — SQL.tn