0Pricing
Coding Interview Prep · Lección

Crear tablas dinámicas con agregación condicional

El patrón portable de CASE dentro de SUM para convertir filas en columnas.

Crear tablas dinámicas con agregación condicional es una lección gratuita de Coding Interview Prep en CoddyKit. Esta es la lección 1 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 Coding Interview Prep, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Coding Interview Prep incluye 4 lecciones en total.

La situación de la entrevista

Una de las tareas más habituales en las entrevistas sobre generación de informes es convertir filas en columnas. Tiene una tabla larga como sales(region, quarter, amount) y el entrevistador quiere un informe ancho con una columna por trimestre.

La respuesta portable e independiente del dialecto que quieren escuchar es la agregación condicional: una expresión CASE dentro de una función de agregación como SUM. Domine este patrón y podrá pivotar datos en cualquier base de datos, incluso en las que no tienen la palabra clave PIVOT.

Formato largo y formato ancho

Antes de pivotar, nombre las estructuras. El formato largo almacena un hecho por fila: cada par región/trimestre ocupa su propia fila. El formato ancho distribuye una categoría entre varias columnas.

  • Largo: fácil de insertar, difícil de leer lado a lado.
  • Ancho: ideal para un informe dirigido a personas.

Un pivote transforma el formato largo en formato ancho. A los entrevistadores les gusta este tema porque comprueba si entiende la agregación, no solo la sintaxis.

-- Long form (the input)
region | quarter | amount
-------+---------+-------
East   | Q1      | 100
East   | Q2      | 150
West   | Q1      | 200
West   | Q2      | 250

El patrón fundamental

El truco consiste en escribir, para cada columna de salida, un CASE que devuelva el valor cuando la fila corresponda a esa columna y NULL en caso contrario. Envuélvalo en una función de agregación para que el grupo se reduzca a una fila por clave.

Interprételo así: sume el importe, pero solo para las filas de Q1. Como SUM ignora NULL, las filas que no coinciden no aportan nada.

SELECT
  region,
  SUM(CASE WHEN quarter = 'Q1' THEN amount END) AS q1,
  SUM(CASE WHEN quarter = 'Q2' THEN amount END) AS q2
FROM sales
GROUP BY region;

Por qué SUM ignora NULL

Este patrón funciona gracias a un hecho que los entrevistadores suelen comprobar: las funciones de agregación omiten los valores NULL. Un CASE sin ELSE devuelve NULL cuando no coincide ninguna rama, por lo que SUM(CASE WHEN ... THEN amount END) solo suma las filas seleccionadas.

Si escribiera ELSE 0, también funcionaría con SUM (sumar cero no cambia nada), pero alteraría el comportamiento de AVG, MIN y COUNT.

-- Both produce the same SUM result:
SUM(CASE WHEN quarter = 'Q1' THEN amount END)
SUM(CASE WHEN quarter = 'Q1' THEN amount ELSE 0 END)

Ejemplo práctico: informe trimestral

Aquí tiene la consulta completa aplicada a los datos de ejemplo. Cada región se convierte en una fila y cada trimestre, en una columna.

GROUP BY region es lo que agrupa las cuatro filas de entrada en dos filas de salida. Sin esta cláusula, obtendría una fila por cada fila de entrada, con la mayoría de los valores en NULL.

SELECT
  region,
  SUM(CASE WHEN quarter = 'Q1' THEN amount END) AS q1,
  SUM(CASE WHEN quarter = 'Q2' THEN amount END) AS q2
FROM sales
GROUP BY region;

-- Result:
-- region | q1  | q2
-- East   | 100 | 150
-- West   | 200 | 250

Elegir la función de agregación adecuada

La función de agregación que envuelva a CASE debe corresponderse con la pregunta:

  • SUM cuando cada celda suma valores.
  • MAX o MIN cuando cada par región/trimestre tiene exactamente un valor y solo desea mostrarlo.
  • COUNT cuando cada celda cuenta las filas coincidentes.

En las entrevistas suelen preguntar por la variante con COUNT: ¿cuántos pedidos hay por estado y por mes?

SELECT
  month,
  COUNT(CASE WHEN status = 'shipped' THEN 1 END) AS shipped,
  COUNT(CASE WHEN status = 'cancelled' THEN 1 END) AS cancelled
FROM orders
GROUP BY month;

MAX para celdas con un único valor

Cuando cada par clave/categoría contiene un único valor (una verdadera tabla cruzada, no un total), use MAX o MIN. Ambas funciones devuelven el único valor no NULL e ignoran los NULL de las ramas que no coinciden.

Esta es la opción segura cuando está reorganizando atributos en lugar de sumar importes; por ejemplo, al convertir una tabla de configuración de clave/valor en una fila por entidad.

-- Turn key/value rows into one wide row per user
SELECT
  user_id,
  MAX(CASE WHEN attr = 'city'  THEN value END) AS city,
  MAX(CASE WHEN attr = 'plan'  THEN value END) AS plan
FROM user_attributes
GROUP BY user_id;

Gestionar las celdas de salida NULL

Si una región no tuvo ventas en Q2, su celda q2 aparece como NULL. Es posible que en una entrevista le pidan mostrar 0 en su lugar. Envuelva toda la función de agregación en COALESCE.

Coloque COALESCE fuera de la función de agregación, no dentro de CASE, para sustituir el valor únicamente cuando todo el grupo carezca de filas coincidentes.

SELECT
  region,
  COALESCE(SUM(CASE WHEN quarter = 'Q1' THEN amount END), 0) AS q1,
  COALESCE(SUM(CASE WHEN quarter = 'Q2' THEN amount END), 0) AS q2
FROM sales
GROUP BY region;

Añadir una columna de total general

Una pregunta de seguimiento habitual es cómo añadir un total de todas las columnas dinamizadas. No necesita sumar las columnas por nombre. Un SUM(amount) normal sobre el mismo grupo proporciona el total de la fila, porque ignora por completo el filtrado de CASE.

Esto demuestra al entrevistador que entiende que cada función de agregación del SELECT se calcula de forma independiente sobre el mismo grupo.

SELECT
  region,
  SUM(CASE WHEN quarter = 'Q1' THEN amount END) AS q1,
  SUM(CASE WHEN quarter = 'Q2' THEN amount END) AS q2,
  SUM(amount) AS total
FROM sales
GROUP BY region;

La alternativa de la función de agregación filtrada

PostgreSQL y el estándar SQL admiten FILTER (WHERE ...), una forma más clara de escribir una agregación condicional. Se lee mejor y evita el código repetitivo de CASE.

Menciónelo en una entrevista para demostrar amplitud de conocimientos, pero tenga en cuenta que MySQL y SQL Server no lo admiten, por lo que CASE sigue siendo la respuesta portable.

-- Postgres / standard SQL
SELECT
  region,
  SUM(amount) FILTER (WHERE quarter = 'Q1') AS q1,
  SUM(amount) FILTER (WHERE quarter = 'Q2') AS q2
FROM sales
GROUP BY region;

La gran limitación

La agregación condicional tiene un inconveniente que los entrevistadores suelen plantear: debe enumerar manualmente cada columna de salida. Si los trimestres o las categorías no se conocen de antemano, esta consulta estática no puede adaptarse.

Este problema se denomina pivot dinámico y requiere SQL generado. Sin embargo, para un conjunto fijo y conocido de categorías, la agregación condicional es la opción más limpia y portable.

Comprobación rápida

Compruebe cuánto domina el patrón de agregación condicional.

Resumen

La agregación condicional es la operación de pivot portable que cualquier entrevistador acepta:

  • Un CASE por cada columna de salida, envuelto en una función de agregación.
  • SUM para totales, MAX/MIN para celdas con un único valor y COUNT para recuentos.
  • Funciona porque las funciones de agregación ignoran el NULL de las ramas que no coinciden.
  • Use COALESCE para convertir las celdas vacías en 0.
  • Limitación: las columnas deben estar codificadas explícitamente, lo que da paso a los pivots dinámicos.

Preguntas frecuentes

¿La lección «Crear tablas dinámicas con agregación condicional» es gratis?

Sí — el texto completo de «Crear tablas dinámicas con agregación condicional» 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 Coding Interview Prep, actualiza a CoddyKit PRO. El curso de Coding Interview Prep incluye 4 lecciones en total.

¿Qué aprenderé en «Crear tablas dinámicas con agregación condicional»?

El patrón portable de CASE dentro de SUM para convertir filas en columnas. Practicas Coding Interview Prep 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 Coding Interview Prep?

No se requiere experiencia previa. Coding Interview Prep 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 1 de 4.

¿Cuánto tiempo toma la lección «Crear tablas dinámicas con agregación condicional»?

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 Coding Interview Prep?

Sí. Cada lección de Coding Interview Prep 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. Crear tablas dinámicas con agregación condicional
  2. Sintaxis PIVOT y de tablas cruzadas específica del proveedor
  3. Convertir columnas en filas
  4. Tablas dinámicas con columnas desconocidas
← Volver a Coding Interview Prep