CASE WHEN en SQL Server: condiciones y ejemplos para clasificar datos

Aprendé a usar CASE WHEN en SQL Server con ejemplos: crear columnas condicionales, clasificar ventas por rangos, usar ELSE y comparar datos contra el promedio.

Tutorial SQL: sintaxis CASE, WHEN, THEN, ELSE y END; clasificación de ventas y comparación contra el promedio · Ver en YouTube

Qué es CASE WHEN en SQL Server

CASE WHEN es una expresión condicional de SQL. Funciona de forma parecida a un if / else de programación: evalúa una condición y devuelve un resultado si se cumple; si no, puede evaluar otra condición o usar una alternativa final.

Por ejemplo, si una venta supera cierto monto, podemos mostrar Venta alta; si no, Venta baja. El dato Total sigue siendo el mismo en la tabla: CASE WHEN crea una columna nueva en el resultado de la consulta.

Esto es habitual en informes de ventas, paneles, exportaciones y reportes donde necesitás mostrar una clasificación más entendible que un número crudo.


Sintaxis de CASE WHEN: CASE, WHEN, THEN, ELSE y END

La estructura básica es esta:

CASE
  WHEN condicion THEN resultado
  ELSE resultado_si_no_se_cumple
END AS NombreDeLaColumna

Cada palabra tiene una función concreta:

PartePara qué sirve
CASEInicia la evaluación condicional
WHENDefine la condición que querés revisar
THENIndica qué devolver si esa condición es verdadera
ELSEDevuelve un valor cuando no se cumple ningún WHEN
ENDCierra el bloque CASE
ASAsigna un alias a la columna creada

Primer ejemplo: clasificar una venta como alta o baja

Supongamos que existe una tabla Ventas con una columna Total. Podemos mostrar todas las columnas y sumar una clasificación:

SELECT
  IDVenta,
  Cliente,
  Total,
  CASE
    WHEN Total > 100 THEN 'Venta alta'
    ELSE 'Venta baja'
  END AS TipoVenta
FROM Ventas;

El resultado tendría una forma parecida a esta:

IDVentaClienteTotalTipoVenta
1Ana80Venta baja
2Bruno220Venta alta
3Carla100Venta baja

TipoVenta no existe físicamente en la tabla: aparece solo al ejecutar esta consulta. Por eso podés usar CASE WHEN para adaptar cómo se ven los datos sin tocar registros con UPDATE.


Varias condiciones: ventas bajas, medianas y altas

Un CASE puede tener más de un WHEN. SQL Server los evalúa de arriba hacia abajo y se queda con el primer caso que se cumple.

En este ejemplo queremos:

  • menos de 150 → Venta baja;
  • desde 150 hasta 400 → Venta mediana;
  • más de 400 → Venta alta.
SELECT
  IDVenta,
  Cliente,
  Total,
  CASE
    WHEN Total < 150 THEN 'Venta baja'
    WHEN Total <= 400 THEN 'Venta mediana'
    ELSE 'Venta alta'
  END AS TipoVenta
FROM Ventas;

No hace falta escribir Total >= 150 AND Total <= 400 en el segundo WHEN. Como el primer caso ya atrapó todos los valores menores a 150, al llegar a WHEN Total <= 400 solo quedan los valores desde 150 hasta 400.

CASE evalúa en orden:
1. ¿Total es menor a 150?       → Venta baja
2. Si no: ¿Total es menor o igual a 400? → Venta mediana
3. Si no:                       → Venta alta

Agregar más niveles

Podés seguir sumando condiciones según la necesidad del reporte:

SELECT
  IDVenta,
  Cliente,
  Total,
  CASE
    WHEN Total < 150 THEN 'Venta baja'
    WHEN Total <= 400 THEN 'Venta mediana'
    WHEN Total <= 1000 THEN 'Venta media alta'
    ELSE 'Venta mega alta'
  END AS TipoVenta
FROM Ventas;

El orden es importante. Si pusieras WHEN Total <= 1000 antes de WHEN Total <= 400, una venta de 250 entraría en el primer caso y nunca llegaría a ser clasificada como mediana.


Cómo usar ELSE en CASE WHEN

ELSE cubre todo lo que no coincidió con ningún WHEN. En el ejemplo anterior, si una venta no es menor a 150 ni menor o igual a 400, necesariamente es mayor a 400; por eso ELSE 'Venta alta' es suficiente.

Podrías escribir el último caso de esta manera:

WHEN Total > 400 THEN 'Venta alta'

Pero cuando las condiciones previas ya cubren el resto de los casos, ELSE deja la consulta más simple y evita repetir lógica.


Ejercicio completo: crear la columna TipoVenta

Este ejercicio reúne lo visto: mostrar los datos existentes y crear una columna que clasifique cada venta.

SELECT
  IDVenta,
  Cliente,
  Total,
  CASE
    WHEN Total < 150 THEN 'Venta baja'
    WHEN Total <= 400 THEN 'Venta mediana'
    ELSE 'Venta alta'
  END AS TipoVenta
FROM Ventas
ORDER BY TipoVenta;

ORDER BY TipoVenta sirve para ordenar el resultado por la clasificación. Tené presente que, al ser texto, SQL Server lo ordena alfabéticamente. Si necesitás un orden de negocio específico, podés crear otro CASE que devuelva números para usarlo en el ORDER BY.


CASE WHEN con subconsulta: comparar una venta contra el promedio

También podés usar CASE WHEN con valores calculados dinámicamente. En este caso, queremos saber si cada venta está por encima, igual o por debajo del promedio general.

Primero, esta subconsulta calcula el promedio de todas las ventas:

SELECT AVG(Total)
FROM Ventas;

Después la usamos dentro de cada condición:

SELECT
  IDVenta,
  Cliente,
  Total,
  CASE
    WHEN Total > (SELECT AVG(Total) FROM Ventas)
      THEN 'Superior al promedio'
    WHEN Total = (SELECT AVG(Total) FROM Ventas)
      THEN 'Igual al promedio'
    ELSE 'Inferior al promedio'
  END AS ComparacionPromedio
FROM Ventas;

El promedio no queda fijo. Si se insertan, actualizan o eliminan ventas, AVG(Total) se vuelve a calcular al ejecutar la consulta y la clasificación se adapta a los datos actuales.

Para profundizar en este tipo de consultas, revisá subqueries en SQL Server con IN, AVG y MAX.


Por qué puede no haber ventas “igual al promedio”

El promedio puede tener decimales, por ejemplo 292.33. Si ningún Total coincide exactamente con ese número, la condición Total = promedio no devuelve filas. No es un error: simplemente no hay una venta con ese importe exacto.

En un reporte real podés mantener ese caso porque expresa correctamente la lógica, aunque a veces no aparezca en el resultado.


Usos reales de CASE WHEN en SQL

CASE WHEN aparece mucho cuando necesitás convertir datos técnicos en información útil para una persona:

  • clasificar ventas por monto, prioridad o estado;
  • marcar clientes activos e inactivos;
  • mostrar si un pedido está atrasado, en fecha o próximo a vencer;
  • generar etiquetas para informes y exportaciones;
  • comparar cada registro con un promedio, objetivo o límite;
  • crear indicadores antes de agrupar y resumir datos.

Por ejemplo, antes de hacer un reporte con GROUP BY, podés clasificar los registros con CASE y luego contar o sumar cada categoría. Si querés avanzar con resúmenes por cliente, seguí con GROUP BY en SQL Server.


Errores comunes al usar CASE WHEN

Olvidar END

CASE se abre con CASE y siempre cierra con END. Es uno de los errores de sintaxis más frecuentes.

Usar condiciones en un orden incorrecto

Las condiciones se evalúan en orden. Colocá primero los rangos más específicos o los límites más bajos, como en el ejemplo de ventas.

No contemplar el valor del límite

Si escribís Total < 100 y luego Total > 100, el valor exactamente igual a 100 no entra en ninguna condición. Usá <=, >= o un ELSE cuando corresponda.

Pensar que CASE modifica la tabla

Un CASE dentro de SELECT solo cambia el resultado que ves. Para actualizar datos almacenados se usa UPDATE, pero no hace falta hacerlo para la mayoría de los reportes.


Resumen: CASE WHEN para crear columnas condicionales

ConceptoIdea clave
CASE WHENEvalúa condiciones dentro de una consulta
THENDevuelve un resultado cuando se cumple la condición
ELSECubre los casos restantes y evita NULL inesperados
ENDCierra obligatoriamente la expresión
Alias con ASDa nombre a la nueva columna calculada
Subconsulta con AVGPermite comparar contra un valor dinámico

Con CASE WHEN ya podés transformar una consulta simple en un resultado mucho más útil: no solo mostrás números, sino que los interpretás según reglas claras.


Próximos pasos

Mirá el tutorial completo de CASE WHEN paso a paso en YouTube.

En este artículo