Saltar al contenido principal

Explicación de la sentencia CASE en SQL

Entender cómo explotar la sentencia CASE de SQL para crear columnas categóricas.
Actualizado 25 feb 2025  · 7 min de lectura

Si has trabajado con bases de datos, probablemente te habrás dado cuenta de que los datos rara vez son perfectos y a menudo requieren manipulación para extraer perspectivas significativas.

Para satisfacer esta necesidad, SQL ofrece una potente construcción, llamada sentencia CASE, que te permite crear nuevas columnas o transformar datos basándote en condiciones aplicadas a columnas existentes.

En este artículo, te explicaremos qué es una declaración CASE, por qué es esencial y exploraremos varios casos de uso para ayudarte a aprovechar su potencial. ¡Empecemos!

¿Qué es una declaración CASE?

La Sentencia Caso en SQL es una expresión condicional que introduce una lógica de toma de decisiones en tu consulta. Funciona de forma similar a una sentencia sentencia if-elif-else en Pythonpermitiéndote evaluar varias condiciones y devolver resultados específicos en función de ellas.

La sintaxis general es la siguiente

CASE
	WHEN boolean_condition1 THEN result1
	WHEN boolean_condition2 THEN result2
	ELSE result3
END

Funciona así:

  • La palabra clave CASE marca el inicio de la expresión, mientras que END marca su conclusión, encerrando la declaración condicional como un marco.
  • Cada cláusula WHEN evalúa una condición. Si la condición es verdadera, la cláusula THEN correspondiente devuelve un resultado especificado.
  • Si no se cumple ninguna de las condiciones de las cláusulas WHEN, la cláusula ELSE proporciona un resultado por defecto.

¿Por qué es importante la declaración CASE?

La sentencia CASE WHEN es una herramienta valiosa en las consultas SQL, ya que ofrece varias ventajas clave:

  • Transformación de datos: te permite crear nuevas columnas a partir de los valores de columnas existentes.
  • Agregación condicional: te permite crear valores agregados (por ejemplo, sumas, recuentos, máximos) para subconjuntos específicos de datos basados en condiciones.
  • Filtrado de datos: puedes incluir o excluir filas basándote en criterios específicos.
  • Simplificación de las consultas y legibilidad: Ayuda a consolidar la lógica en una sola consulta, reduciendo la necesidad de consultas múltiples, tablas temporales o uniones complejas.
  • Optimización del rendimiento: al reducir la complejidad de las consultas SQL, la sentencia CASE también puede contribuir a optimizar el rendimiento y minimizar el tiempo de ejecución, sobre todo cuando evita la necesidad de cálculos y transformaciones adicionales.

Declaración CASE simple

En este artículo, vamos a utilizar la tabla film de la base de datos cinema. Supongamos que queremos crear una nueva columna categórica basada en los valores del ROI (ratio bruto/presupuesto):

SELECT 
	title,
	gross,
	budget,
	gross / budget AS ROI,
CASE
	 WHEN gross / budget < 1 THEN 'low ROI'
	 WHEN gross / budget BETWEEN 1 AND 2 THEN 'medium ROI'
	 ELSE 'high ROI'
END as ROI_group
FROM cinema.films
WHERE budget > 0 AND gross > 0 AND release_year = 2015;

Dados el bruto y el presupuesto, hemos calculado el ROI, que es una popular métrica de rentabilidad que mide los ingresos generados por una inversión.

Además del campo ROI, también obtuvimos su categorización para comunicarnos mejor:

  • Si las películas con ROI son inferiores a 1, el valor es "ROI bajo".
  • Las películas con ROI entre 1 y 2 pertenecen a la categoría "ROI medio".
  • "ROI alto" es la etiqueta asignada a las películas con un ROI mayor o igual a 2.

También hemos filtrado las películas que tienen presupuestos o valores brutos nulos o negativos. Además, restringimos los resultados a las películas estrenadas en 2015.

Uso de CASE en la cláusula Agrupar por

En el primer ejemplo, hemos creado un nuevo campo, que se puede aplicar para agregar los datos y obtener información adicional.

Por ejemplo, podemos calcular el bruto medio y el presupuesto medio para cada grupo de ROI:

SELECT 
CASE
	 WHEN gross / budget < 1 THEN 'low ROI'
	 WHEN gross / budget BETWEEN 1 AND 2 THEN 'medium ROI'
	 ELSE 'high ROI'
END AS ROI_group,
avg(gross) as avg_gross,
avg(budget) as avg_budget
FROM cinema.films
WHERE budget > 0 AND gross > 0 AND release_year = 2015
GROUP BY
CASE
	 WHEN gross / budget < 1 THEN 'low ROI'
	 WHEN gross / budget BETWEEN 1 AND 2 THEN 'medium ROI'
	 ELSE 'high ROI'
END
ORDER BY avg(gross) DESC
;

Para agrupar los datos, basta con poner la sentencia case en la cláusula GROUP BY. Para tener más información, ordenamos las filas en orden decreciente según el bruto medio. De este modo, conseguimos que el bruto medio más alto se asigne al ROI alto y viceversa para el ROI bajo.

Uso de CASE en la cláusula WHERE

Otra ventaja de la sentencia CASE es que permite filtrar filas basándose en condiciones específicas. Por ejemplo, podemos aplicar diferentes umbrales de ROI en función del idioma de la película. Es sabido que las películas inglesas tienen un ROI constantemente alto. Por tanto, el umbral debería tener un valor más alto, mientras que suponemos que las demás lenguas tienen un ROI más bajo.

SELECT 
    title,
    gross,
    budget,
    language,
    gross / budget AS ROI
FROM cinema.films
WHERE 
    CASE 
        WHEN language = 'English' THEN gross / budget > 2 -- English films need ROI > 2
        WHEN language = 'French' THEN gross / budget > 1.5 -- French films need ROI > 1.5
        ELSE gross / budget > 1.3 -- Default for other languages
    END;

Cálculo de agregaciones

También nos puede interesar calcular el número de películas con alto ROI frente a las de bajo ROI estrenadas en 2015:

SELECT 
    SUM(CASE WHEN gross / budget > 2 THEN 1 ELSE 0 END) AS high_roi_films,
    SUM(CASE WHEN gross / budget BETWEEN 1 AND 2 THEN 1 ELSE 0 END) AS medium_roi_films,
    SUM(CASE WHEN gross / budget < 1 THEN 1 ELSE 0 END) AS low_roi_films
FROM cinema.films
WHERE budget > 0 AND gross > 0 AND release_year = 2015;

Dentro de la función SUMA, es como si creáramos un nuevo campo con valor 1 cuando las ROI alcanzan ese umbral, 0 en caso contrario. Si tomamos la suma de esta nueva variable binaria, obtenemos el número de películas que respetan ese criterio.

A partir del resultado, podemos observar que la mayoría de las películas tienen un ROI inferior a 1, mientras que pocas películas son altamente rentables.

Sentencia Case anidada

Uno de los casos de uso más avanzados es la declaración de caso anidada, que es un caso dentro de otro caso. Es muy útil cuando necesitas dividir los datos en subgrupos y aplicar una lógica diferente para cada subgrupo. 

De forma similar al primer ejemplo, queremos crear una nueva columna que se vea influida por los valores de ROI. Como hemos dicho anteriormente, el ROI de las películas en inglés es alto en todo el mundo en comparación con las películas en otros idiomas. 

Por esta razón, sería mejor clasificar las películas en grupos de ROI teniendo en cuenta tanto el ROI como el idioma

SELECT 
    title,
    language,
    gross / budget AS ROI,
    CASE
        WHEN language = 'English' THEN 
            CASE 
                WHEN gross / budget < 2 THEN 'low ROI'
                WHEN gross / budget BETWEEN 2 AND 3 THEN 'medium ROI'
                ELSE 'high ROI'
            END
        ELSE 
            CASE
                WHEN gross / budget < 1 THEN 'low ROI'
                WHEN gross / budget BETWEEN 1 AND 2 THEN 'medium ROI'
                ELSE 'high ROI'
            END
    END AS ROI_group
FROM cinema.films
WHERE budget > 0 AND gross > 0 and release_year = 2006;

En la consulta, la sentencia CASE externa se utiliza para evaluar si el idioma es el inglés o no. Según el idioma, la CASE interna evalúa el ROI: los umbrales son más altos para las películas inglesas y más bajos para las no inglesas. Esta condición multinivel permite mejorar la separación de las láminas de bajo, medio y alto-roi.

Conclusión

La sentencia CASE es una construcción SQL indispensable para extraer información significativa de tus datos. La teoría se alterna con ejemplos prácticos para ayudarte a comprender en profundidad esta poderosa expresión condicional. Si quieres profundizar más, echa un vistazo a curso de manipulación de datos en SQL. Cubre la sentencia CASE, así como otros aspectos clave de SQL, como las subconsultas y las funciones de ventana. Por último, debes comprobar los Fundamentos de SQL para tener una visión general de los cursos que ayudan a dominar SQL.


Eugenia Anello's photo
Author
Eugenia Anello
LinkedIn
Temas

Los mejores cursos de SQL

Programa

SQL Fundamentals

0 min
Master the SQL fundamentals needed for business, learn how to write SQL queries, and start analyzing your data using this powerful language.
Ver detallesRight Arrow
Comienza el curso
Ver másRight Arrow