Convertir columnas en filas
Invertir tablas anchas con UNPIVOT o UNION ALL.
Convertir columnas en filas es una lección gratuita de Coding Interview Prep 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 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.
El problema inverso
Deshacer un pivot es la operación inversa de dinamizar: se toma una tabla ancha y se convierten sus columnas de nuevo en filas. Los entrevistadores preguntan por esto cuando los datos llegan con formato de hoja de cálculo, pero deben normalizarse para su análisis.
Por ejemplo, una tabla con las columnas q1, q2, q3, q4 por región debe convertirse en filas con el formato (region, quarter, amount). Este formato largo es el que prefieren las operaciones de agregación, combinación y creación de gráficos.
-- Wide input we want to unpivot
region | q1 | q2 | q3 | q4
-------+-----+-----+-----+----
East | 100 | 150 | 120 | 180
West | 200 | 250 | 210 | 260El patrón portable con UNION ALL
La respuesta independiente del dialecto es UNION ALL: escriba un SELECT por cada columna de origen, y haga que cada uno emita una etiqueta literal y el valor de esa columna.
Use UNION ALL, no UNION, para no pagar el coste de eliminar duplicados y conservar todas las filas, incluso cuando dos celdas compartan un valor.
SELECT region, 'Q1' AS quarter, q1 AS amount FROM wide_sales
UNION ALL
SELECT region, 'Q2', q2 FROM wide_sales
UNION ALL
SELECT region, 'Q3', q3 FROM wide_sales
UNION ALL
SELECT region, 'Q4', q4 FROM wide_sales;Por qué UNION ALL y no UNION
Esta es una trampa clásica de las entrevistas. UNION elimina las filas duplicadas de todo el resultado. Si East y West tuvieran 100 en Q1, un UNION normal fusionaría las filas idénticas y perdería datos.
UNION ALL concatena sin eliminar duplicados, que es lo que necesita la operación de deshacer un pivot. También es más rápido porque no requiere una ordenación ni un hash para eliminar duplicados.
-- UNION would wrongly merge identical (region, quarter, amount) rows
-- UNION ALL keeps every row, always the correct choice hereAlineación de tipos de columna
Cada rama de UNION ALL debe producir el mismo número de columnas, con tipos compatibles y en el mismo orden. Los nombres de las columnas proceden del primer SELECT.
Si sus columnas anchas difieren en tipo (por ejemplo, una es int y otra decimal), el motor elige un tipo común. Si son realmente incompatibles, haga una conversión explícita para que la unión no falle.
SELECT region, 'revenue' AS metric, CAST(revenue AS decimal(12,2)) AS val FROM t
UNION ALL
SELECT region, 'units', CAST(units AS decimal(12,2)) FROM t;UNPIVOT de SQL Server
SQL Server tiene un operador UNPIVOT específico, más conciso que UNION ALL. Debe indicar el nombre de la nueva columna de valores, el nombre de la nueva columna de etiquetas y enumerar las columnas de origen que se van a plegar.
Un comportamiento importante es que UNPIVOT descarta las filas cuyo valor es NULL. Los entrevistadores comprueban si conoce este efecto secundario.
SELECT region, quarter, amount
FROM wide_sales
UNPIVOT (
amount FOR quarter IN (q1, q2, q3, q4)
) AS u;UNPIVOT descarta los NULL
Si una región tiene NULL en q3, el UNPIVOT de SQL Server simplemente omite esa fila de la salida. Si necesita una fila por cada columna independientemente de los NULL, recurra a UNION ALL, que los conserva.
Explique esta diferencia en una entrevista: el UNPIVOT nativo es conciso, pero pierde los NULL; UNION ALL es más verboso, pero completo.
-- UNPIVOT: q3 NULL for East -> no (East, Q3) row produced
-- UNION ALL: (East, 'Q3', NULL) row IS producedPostgreSQL: LATERAL VALUES
PostgreSQL no tiene UNPIVOT, pero un patrón práctico consiste en utilizar CROSS JOIN LATERAL sobre una lista de VALUES. Cada fila ancha se expande junto con una pequeña tabla en línea de pares (etiqueta, valor).
Es más limpio que un UNION ALL largo y lee la tabla de origen una sola vez.
SELECT w.region, v.quarter, v.amount
FROM wide_sales w
CROSS JOIN LATERAL (VALUES
('Q1', w.q1),
('Q2', w.q2),
('Q3', w.q3),
('Q4', w.q4)
) AS v(quarter, amount);Leer la tabla una sola vez
Conviene mencionar un aspecto de rendimiento: el UNION ALL ingenuo examina la tabla ancha una vez por cada rama (cuatro recorridos para cuatro trimestres). La forma LATERAL VALUES y UNPIVOT de SQL Server leen el origen una sola vez.
Esto es importante en tablas grandes. Si debe utilizar UNION ALL, es posible que el optimizador aún realice varios recorridos, así que mencione LATERAL o UNPIVOT como opciones más eficientes.
Filtrar las celdas vacías
Con UNION ALL o LATERAL conserva las filas cuyos valores son NULL. Si la pregunta requiere únicamente celdas con datos, añada un filtro. Esto imita lo que SQL Server UNPIVOT hace automáticamente.
Decidir si se conservan o se descartan los NULL depende del caso, así que aclare el requisito con el entrevistador antes de escribir el código.
SELECT region, quarter, amount
FROM (
SELECT region, 'Q1' AS quarter, q1 AS amount FROM wide_sales
UNION ALL SELECT region, 'Q2', q2 FROM wide_sales
) t
WHERE amount IS NOT NULL;Ejemplo práctico: agregar después de despivotar
Una pregunta de seguimiento habitual es: "a partir de la tabla trimestral en formato ancho, obtener los ingresos totales por región en todos los trimestres". Una vez que se convierte al formato largo, la agregación es trivial: un único SUM agrupado por región.
Esto demuestra el verdadero motivo para despivotar primero. Sumar cuatro columnas independientes es frágil, pero un SUM(amount) GROUP BY region en formato largo se adapta a cualquier cantidad de trimestres.
WITH long_sales AS (
SELECT region, 'Q1' AS quarter, q1 AS amount FROM wide_sales
UNION ALL SELECT region, 'Q2', q2 FROM wide_sales
UNION ALL SELECT region, 'Q3', q3 FROM wide_sales
UNION ALL SELECT region, 'Q4', q4 FROM wide_sales
)
SELECT region, SUM(amount) AS total
FROM long_sales
GROUP BY region;Cuándo despivotar
Reconozca la señal de que debe despivotar en un problema planteado:
- La entrada tiene columnas repetidas que en realidad son valores (meses, años, métricas).
- Necesita agregar, combinar o representar gráficamente esos valores.
- Quiere normalizar datos desnormalizados de una hoja de cálculo al importarlos.
El formato largo casi siempre es la estructura adecuada para seguir trabajando con SQL, por lo que despivotar es un primer paso frecuente.
Comprobación rápida
Confirme que conoce el error más habitual al despivotar.
Resumen
Despivotar convierte las columnas en filas:
- Portable: un
SELECTpor columna, unidos medianteUNION ALL(nunca unUNIONsimple). - SQL Server:
UNPIVOTnativo, conciso, pero descarta los valores NULL. - Postgres:
CROSS JOIN LATERAL (VALUES ...), con un único recorrido. - Alinee la cantidad y los tipos de las columnas en todas las ramas; filtre los NULL si la pregunta lo requiere.
Preguntas frecuentes
¿La lección «Convertir columnas en filas» es gratis?
Sí — el texto completo de «Convertir columnas en filas» 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 «Convertir columnas en filas»?
Invertir tablas anchas con UNPIVOT o UNION ALL. 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 3 de 4.
¿Cuánto tiempo toma la lección «Convertir columnas en filas»?
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
- Crear tablas dinámicas con agregación condicional
- Sintaxis PIVOT y de tablas cruzadas específica del proveedor
- Convertir columnas en filas
- Tablas dinámicas con columnas desconocidas