0Pricing
SQL Academy · Lección

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'
END

CASE 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

  1. UNION, INTERSECT y EXCEPT
  2. UNION ALL frente a UNION (coste de eliminar duplicados)
  3. Expresiones CASE y consultas pivot
  4. Patrones de tablas cruzadas (crosstab() de PostgreSQL)
← Volver a SQL Academy