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:
| Parte | Para qué sirve |
|---|---|
CASE | Inicia la evaluación condicional |
WHEN | Define la condición que querés revisar |
THEN | Indica qué devolver si esa condición es verdadera |
ELSE | Devuelve un valor cuando no se cumple ningún WHEN |
END | Cierra el bloque CASE |
AS | Asigna 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:
| IDVenta | Cliente | Total | TipoVenta |
|---|---|---|---|
| 1 | Ana | 80 | Venta baja |
| 2 | Bruno | 220 | Venta alta |
| 3 | Carla | 100 | Venta 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
| Concepto | Idea clave |
|---|---|
CASE WHEN | Evalúa condiciones dentro de una consulta |
THEN | Devuelve un resultado cuando se cumple la condición |
ELSE | Cubre los casos restantes y evita NULL inesperados |
END | Cierra obligatoriamente la expresión |
Alias con AS | Da nombre a la nueva columna calculada |
Subconsulta con AVG | Permite 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
- Practicá subconsultas dinámicas con IN, AVG y MAX en SQL Server.
- Usá
GROUP BYpara convertir esas clasificaciones en resúmenes por cliente. - Cuando necesites filtrar resúmenes, aprendé a usar HAVING después de GROUP BY.
Mirá el tutorial completo de CASE WHEN paso a paso en YouTube.