Expresiones CASE y consultas pivot
Use CASE WHEN dentro de agregaciones para convertir tablas verticales en informes de tablas cruzadas anchas.
Expresiones CASE y consultas pivot es una lección gratuita de SQL Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de SQL Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de SQL Academy incluye 4 lecciones en total.
CASE: If/Else en línea para SQL
CASE es el operador ternario de SQL. Tiene dos formas:
-- Searched CASE
CASE WHEN x > 0 THEN 'positive'
WHEN x < 0 THEN 'negative'
ELSE 'zero' END
-- Simple CASE
CASE status
WHEN 'A' THEN 'active'
WHEN 'P' THEN 'pending'
ELSE 'unknown'
ENDCASE en SELECT
Calcule una columna derivada:
SELECT id, total,
CASE
WHEN total >= 1000 THEN 'whale'
WHEN total >= 100 THEN 'regular'
ELSE 'small'
END AS bucket
FROM orders;CASE en WHERE y ORDER BY
Filtrado y ordenación personalizados:
-- Custom sort:
ORDER BY
CASE WHEN status = 'urgent' THEN 0 ELSE 1 END,
created_at DESC;
-- Conditional filter:
WHERE CASE WHEN $1 = 'paid' THEN status = 'paid'
ELSE status IN ('pending','paid')
END;CASE dentro de agregaciones: recuentos condicionales
El truco clásico para crear una tabla dinámica:
SELECT user_id,
COUNT(*) AS total,
SUM(CASE WHEN status = 'paid' THEN 1 ELSE 0 END) AS paid,
SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END) AS pending,
SUM(CASE WHEN status = 'cancelled' THEN 1 ELSE 0 END) AS cancelled
FROM orders
GROUP BY user_id;FILTER: una alternativa más clara
La cláusula FILTER de PostgreSQL es más legible:
SELECT user_id,
COUNT(*) AS total,
COUNT(*) FILTER (WHERE status = 'paid') AS paid,
COUNT(*) FILTER (WHERE status = 'pending') AS pending,
COUNT(*) FILTER (WHERE status = 'cancelled') AS cancelled
FROM orders
GROUP BY user_id;Convertir los meses en columnas
Convierta el formato largo en formato ancho mediante CASE + una agregación:
SELECT year,
SUM(CASE WHEN month = 1 THEN revenue END) AS jan,
SUM(CASE WHEN month = 2 THEN revenue END) AS feb,
-- ...
SUM(CASE WHEN month = 12 THEN revenue END) AS dec
FROM monthly_revenue
GROUP BY year
ORDER BY year;Convertir las categorías en columnas
Una fila por usuario y una columna por estado:
SELECT user_id,
SUM(total) FILTER (WHERE status = 'paid') AS paid_total,
SUM(total) FILTER (WHERE status = 'pending') AS pending_total
FROM orders GROUP BY user_id;Limitaciones de las tablas dinámicas con CASE
Debe conocer las columnas de destino al escribir la consulta. Para tablas dinámicas dinámicas, genere el SQL en la aplicación o utilice PL/pgSQL procedural.
CASE frente a COALESCE / NULLIF
COALESCE = "el primer valor no NULL". NULLIF = "NULL si son iguales". CASE es más general; utilícelo cuando COALESCE/NULLIF no sean adecuados.
Compatibilidad de tipos
Todas las ramas de CASE deben producir tipos compatibles. Haga una conversión explícita si mezcla tipos:
SELECT CASE WHEN x THEN 1::TEXT ELSE 'no' END;CASE anidado
Bifurcación en varios niveles:
SELECT CASE
WHEN amount IS NULL THEN 'no payment'
WHEN amount = 0 THEN 'free'
WHEN amount < 10 THEN 'cheap'
ELSE
CASE WHEN paid_at IS NULL THEN 'overdue' ELSE 'paid' END
END AS status FROM invoices;Resumen
CASE es el "if/else" universal de SQL.
- Columnas calculadas en SELECT
- Tablas dinámicas mediante CASE en una agregación o FILTER
- Lógica personalizada en WHERE / ORDER BY
Comprobación rápida
¿Qué cláusula resulta más legible para realizar agregaciones condicionales en PostgreSQL?
Preguntas frecuentes
¿La lección «Expresiones CASE y consultas pivot» es gratis?
Sí — el texto completo de «Expresiones CASE y consultas pivot» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de SQL Academy, actualiza a CoddyKit PRO. El curso de SQL Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Expresiones CASE y consultas pivot»?
Use CASE WHEN dentro de agregaciones para convertir tablas verticales en informes de tablas cruzadas anchas. Practicas SQL Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar SQL Academy?
No se requiere experiencia previa. SQL Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «Expresiones CASE y consultas pivot»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de SQL Academy?
Sí. Cada lección de SQL Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- UNION, INTERSECT y EXCEPT
- UNION ALL frente a UNION (coste de eliminar duplicados)
- Expresiones CASE y consultas pivot
- Patrones de tablas cruzadas (crosstab() de PostgreSQL)