Lecciones del módulo (3/4)
Lógica condicional: CASE WHEN
Todo lo que hemos visto hasta ahora extrae datos tal cual. Sin embargo, a menudo quieres
para transformarlo: clasificar los salarios en niveles, marcar las nuevas contrataciones como
"junior", traduce un código numérico en una etiqueta legible. estándar de SQL
La herramienta para esto se llama CASE WHEN.
La sintaxis: un mini if/else
CASE
WHEN condition_1 THEN value_1
WHEN condition_2 THEN value_2
...
ELSE default_value
ENDSe lee exactamente como un if/else if/else en cualquier idioma: SQL evalúa
las condiciones en orden y se detiene en la primera verdadera, devolviendo el
CÓDIGOPH1 correspondiente. Si ninguno es verdadero, devuelve el valor ELSE. si tu
omite ELSE y ninguna rama coincide, devuelve NULL.
-- Classify employees by salary tier:
SELECT first_name,
last_name,
salary,
CASE
WHEN salary >= 50000 THEN 'Senior'
WHEN salary >= 35000 THEN 'Mid'
ELSE 'Junior'
END AS tier
FROM employees;El CASE vive dentro del SELECT: produce una columna como cualquier
función, y es perfectamente normal darle un alias con AS (aquí
CÓDIGOPH3).
Dónde utilizar CASE
Tres lugares recurrentes:
- En
SELECTpara crear columnas derivadas (el ejemplo anterior). - En
ORDER BYpara clasificación "personalizada":SQLORDER BY CASE department_id WHEN 1 THEN 0 ELSE 1 END, last_name; -- Engineering first, then the rest, alphabetically by last name. - Funciones agregadas internas para "contar condicionalmente":
Este patrón,SQL
SELECT COUNT(*) AS total, SUM(CASE WHEN salary >= 50000 THEN 1 ELSE 0 END) AS senior, SUM(CASE WHEN salary < 35000 THEN 1 ELSE 0 END) AS junior FROM employees;SUM(CASE WHEN … THEN 1 ELSE 0 END), es el más común "recuento condicional" utilizado en los paneles.
La forma "compacta"
También hay una variante más corta cuando comparas una sola expresión contra valores exactos:
CASE department_id
WHEN 1 THEN 'Ingegneria'
WHEN 2 THEN 'Vendite'
ELSE 'Altro'
ENDEs equivalente a CASE WHEN department_id = 1 THEN ... WHEN department_id = 2 THEN ... END, sólo que más compacto. Sólo funciona para igualdad exacta: si
necesitas >= u otra comparación, tienes que volver a la versión extendida
forma.
Pruébalo
Para cada empleado, muestre el nombre (first_name), el apellido (last_name) y una columna de 'nivel' que sea 'Alto' si el salario es de al menos 50000; de lo contrario, 'Estándar'. Tres columnas, una fila por empleado.
Mostrar pista
La condición es salario >= 50000. Recuerde cerrar el CASO con FIN y utilizar el alias 'nivel'.
Solución disponible después de 3 intentos
Ejercicio de revisión
Para cada departamento (department_id), cuente cuántos empleados tienen un salario alto (>= 50000) y cuántos uno estándar (< 50000) usando SUM(CASE...). Tres columnas: depart_id, alto, estándar. Ordenar por id_departamento (ÚLTIMOS NULLS).
Mostrar pista
El patrón SUM(CASE WHEN... THEN 1 ELSE 0 END) es el recuento condicional.
Solución disponible después de 3 intentos