Data Analyst

CASE WHEN a SQL: crear categorías comerciales

Transforme una regla de negocio en una columna legible sin modificar los datos de origen.

Equipo de SQL.tn11 min
Consulta SQL usando CASE WHEN para clasificar filas de datos

CASE WHEN traduce una regla en un valor

Un informe a menudo debe agrupar valores brutos en categorías comprensibles: pedido pequeño, mediano o grande; cliente activo o inactivo; objetivo alcanzado o no.

La expresión CASE evalúa las condiciones en orden y devuelve el valor asociado con la primera condición verdadera. Crea una columna de resultados sin modificar la tabla fuente.

Las reglas y cantidades utilizadas aquí son ejemplos educativos. Es necesario definir un umbral real con los responsables de la profesión en cuestión.

La sintaxis completa de CASE WHEN

Cada rama comienza con WHEN, describe una condición y luego informa el resultado después de THEN. ELSE cubre todos los casos restantes y END cierra la expresión.

Un alias colocado después de END le da un nombre utilizable a la nueva columna.

  • CASE comienza la expresión.
  • CUANDO define una condición.
  • ENTONCES proporciona el resultado correspondiente.
  • ELSE procesa las otras líneas.
  • FIN cierra la expresión.
Ordenar pedidos por importe
SELECT
  id_commande,
  montant,
  CASE
    WHEN montant >= 150 THEN 'Alta'
    WHEN montant >= 50 THEN 'Media'
    ELSE 'Bajo'
  END AS tranche_montant
FROM commandes
ORDER BY id_commande ASC;

El orden de las condiciones determina el resultado.

CASE se detiene en la primera condición verdadera. Por lo tanto, en este ejemplo los umbrales deben escribirse desde el más restrictivo hasta el más amplio.

Si montant >= 50 apareciera antes de montant >= 150, un pedido de 200 satisfaría inmediatamente la primera rama y se clasificaría como "Medio".

Orden correcto de los umbrales.
CASE
  WHEN montant >= 150 THEN 'Alta'
  WHEN montant >= 50 THEN 'Media'
  ELSE 'Bajo'
END
Prueba siempre los valores límite: 49,99; 50; 149,99 y 150 en este ejemplo.

¿Qué pasa sin MÁS?

Cuando ninguna de las condiciones es verdadera y no hay ningún ELSE presente, CASE devuelve NULL. Este comportamiento puede ser voluntario, pero debe anticiparse en filtros y agregaciones posteriores.

Agregar ELSE a menudo hace que la regla sea más fácil de verificar. Una etiqueta como “Sin clasificar” también revela valores que no entran en ninguna categoría esperada.

Informar estado inesperado
SELECT
  id_commande,
  CASE
    WHEN statut = 'Pagado' THEN 'Completada'
    WHEN statut = 'Pendiente' THEN 'Por tratar'
    ELSE 'Por verificar'
  END AS suivi
FROM commandes;

Construyendo un KPI con agregación condicional

CASE puede devolver 1 cuando la condición es verdadera y 0 en caso contrario. Luego, SUM agrega estos indicadores para contar las filas que cumplen con la regla.

Esta técnica permite calcular varios KPI en una sola línea y un único alcance, sin multiplicar consultas.

  • COUNT(*) da el volumen total.
  • Cada CASO produce un indicador 0 o 1.
  • SUM transforma estos indicadores en contadores.
Contar pedidos por estado
SELECT
  COUNT(*) AS nombre_commandes,
  SUM(CASE WHEN statut = 'Pagado' THEN 1 ELSE 0 END) AS commandes_payees,
  SUM(CASE WHEN statut = 'Pendiente' THEN 1 ELSE 0 END) AS commandes_en_attente
FROM commandes;

Agrupar resultados por segmento calculado

Una expresión CASE puede servir como dimensión en un informe. Agrupándolo se obtiene una línea por porción acompañada de un volumen, un total o un promedio.

Dependiendo del motor SQL, el alias no siempre se acepta en GROUP BY. Repetir la expresión sigue siendo una solución explícita y portátil.

Volumen de negocios por tramo
SELECT
  CASE
    WHEN montant >= 150 THEN 'Alta'
    WHEN montant >= 50 THEN 'Media'
    ELSE 'Bajo'
  END AS tranche_montant,
  COUNT(*) AS nombre_commandes,
  SUM(montant) AS chiffre_affaires
FROM commandes
GROUP BY
  CASE
    WHEN montant >= 150 THEN 'Alta'
    WHEN montant >= 50 THEN 'Media'
    ELSE 'Bajo'
  END
ORDER BY chiffre_affaires DESC;

CASE no siempre reemplaza a WHERE

Utiliza WHERE cuando lo necesario sea simplemente eliminar filas. CASE es más adecuado cuando es necesario generar un valor diferente según la línea o calcular varios indicadores condicionales.

Una expresión CASE innecesariamente anidada dificulta la relectura de la regla. Prefiere varias ramas simples y nombres de categorías inequívocos.

  • WHERE selecciona un perímetro.
  • CASE clasifica o transforma un valor.
  • CASE en SUM o COUNT construye una bandera condicional.
  • Una tabla de referencia resulta preferible cuando las reglas son numerosas y cambian con frecuencia.

Comprueba una regla CASE antes de publicarla

Enumere las categorías esperadas, prueba cada umbral exacto y comprueba los valores de NULL. Luego compara el total de segmentos con la cantidad de registros devueltos por el alcance.

Los errores más comunes son condiciones en el orden incorrecto, falta un ELSE, resultados de tipos incompatibles o umbrales que dejan un intervalo sin cubrir.

Una consulta puede ser válida pero aun así aplicar una regla comercial incorrecta. Haga que se vuelvan a leer los umbrales, no solo la sintaxis de SQL.

Pon esta guía en práctica.

Abre el ejercicio relacionado, ejecuta tu consulta y compara el resultado esperado.

Empezar el ejercicio