Sintaxis PIVOT y de tablas cruzadas específica del proveedor
PIVOT de SQL Server y crosstab de Postgres, junto con sus limitaciones.
Sintaxis PIVOT y de tablas cruzadas específica del proveedor es una lección gratuita de SQL Interview Prep en CoddyKit. Esta es la lección 2 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 Interview Prep, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de SQL Interview Prep incluye 4 lecciones en total.
Más allá de la agregación condicional
Ya conoce el pivot portable con CASE. Sin embargo, los entrevistadores también quieren saber si puede utilizar operadores de pivot específicos del proveedor cuando están disponibles.
SQL Server incluye un operador PIVOT específico. PostgreSQL ofrece una función crosstab en la extensión tablefunc. Conocer ambos, así como sus particularidades, demuestra experiencia real.
Anatomía de SQL Server PIVOT
PIVOT de SQL Server requiere tres elementos:
- Una función de agregación aplicada a la columna de valores.
- Una cláusula
FORque indique la columna cuyos valores se convertirán en nuevas columnas. - Una lista
INde los valores literales que se convertirán en columnas.
Debe aplicarse a una tabla derivada que exponga exactamente la clave, la columna de distribución y el valor, sin nada más.
SELECT region, [Q1], [Q2]
FROM (SELECT region, quarter, amount FROM sales) AS src
PIVOT (
SUM(amount)
FOR quarter IN ([Q1], [Q2])
) AS p;El GROUP BY implícito
Un detalle sutil de PIVOT que los entrevistadores suelen comprobar es que la agrupación es implícita. SQL Server agrupa por todas las columnas de origen que NO sean la columna agregada ni la columna de la cláusula FOR.
Por tanto, si la tabla derivada incluye accidentalmente una columna adicional como order_id, el pivot también agrupa por ella y obtiene muchas más filas de las esperadas. Recorte siempre la consulta interna para conservar únicamente la clave, la columna de distribución y el valor.
-- WRONG: order_id leaks in and breaks grouping
FROM (SELECT region, quarter, amount, order_id FROM sales) AS src
PIVOT (SUM(amount) FOR quarter IN ([Q1],[Q2])) AS p;
-- The pivot now groups by region AND order_idNombres de columna entre corchetes
En SQL Server, los nombres de las columnas dinamizadas son los valores literales de los datos, escritos entre corchetes. Si un valor comienza por un dígito o contiene espacios, los corchetes son obligatorios.
Debe seleccionarlas utilizando el mismo nombre entre corchetes en el SELECT externo. Esta es también la razón por la que PIVOT no puede gestionar valores desconocidos sin SQL dinámico: la lista IN está codificada explícitamente.
SELECT region, [2023], [2024]
FROM (SELECT region, yr, amount FROM sales) AS s
PIVOT (SUM(amount) FOR yr IN ([2023], [2024])) AS p;crosstab de PostgreSQL
PostgreSQL no tiene la palabra clave PIVOT. En su lugar, la extensión tablefunc proporciona crosstab, una función que recibe una cadena SQL y reorganiza su resultado.
Primero debe habilitar la extensión. crosstab espera que la consulta de origen devuelva exactamente tres columnas, en este orden: identificador de fila, categoría y valor.
CREATE EXTENSION IF NOT EXISTS tablefunc;
SELECT *
FROM crosstab(
'SELECT region, quarter, amount FROM sales ORDER BY 1, 2'
) AS ct(region text, q1 numeric, q2 numeric);La lista de definición de columnas
La parte más propensa a errores de crosstab es la lista de definición de columnas final AS ct(...). Debe declarar por sí mismo los nombres y tipos de las columnas de salida, y estos deben coincidir con el número y el orden de las categorías.
Si falta una categoría en una fila, crosstab la rellena según su posición, lo que puede desalinear los datos a menos que utilice la forma de dos argumentos que se muestra a continuación.
SELECT *
FROM crosstab(
'SELECT region, quarter, amount FROM sales ORDER BY 1, 2'
) AS ct(region text, q1 numeric, q2 numeric);
-- ct(...) MUST list every output column and its typecrosstab de dos argumentos
Para evitar desalineaciones cuando faltan algunas categorías en ciertas filas, use la forma de dos argumentos. La segunda consulta devuelve la lista completa y ordenada de valores de categoría, de modo que crosstab sabe exactamente a qué columna pertenece cada valor.
Esta es la forma robusta que los entrevistadores esperan cuando las categorías son dispersas.
SELECT *
FROM crosstab(
'SELECT region, quarter, amount FROM sales ORDER BY 1, 2',
'SELECT DISTINCT quarter FROM sales ORDER BY 1'
) AS ct(region text, q1 numeric, q2 numeric);MySQL no tiene ninguno de los dos
Si el entrevistador pregunta por MySQL, la respuesta es directa: MySQL no tiene PIVOT ni crosstab. La única opción es la agregación condicional con CASE (o la abreviatura SUM(... ) + IF()).
Precisamente por eso se valora tanto el patrón portable con CASE: es el mínimo común denominador que funciona en cualquier motor.
-- MySQL: only conditional aggregation works
SELECT
region,
SUM(IF(quarter = 'Q1', amount, 0)) AS q1,
SUM(IF(quarter = 'Q2', amount, 0)) AS q2
FROM sales
GROUP BY region;Ejemplo práctico: recuentos de estados en SQL Server
Una necesidad habitual de informes es la siguiente: «una fila por región, con una columna que cuente los pedidos de cada estado». En SQL Server, proporcione a PIVOT una tabla derivada recortada y utilice COUNT.
Como cuenta la propia columna de estado, se contabiliza cada fila de estado no NULL dentro de un grupo. El SELECT externo enumera cada estado como una columna entre corchetes. Esta es la alternativa concisa a escribir tres expresiones COUNT(CASE ...).
SELECT region, [pending], [shipped], [delivered]
FROM (SELECT region, status FROM orders) AS src
PIVOT (
COUNT(status)
FOR status IN ([pending], [shipped], [delivered])
) AS p;Limitaciones compartidas
PIVOT y crosstab comparten la misma limitación fundamental que la agregación condicional: las columnas de salida deben conocerse al escribir la consulta.
- SQL Server: la lista
INes literal. - crosstab de Postgres: la lista de definición de columnas es literal.
Ninguno puede descubrir categorías durante la ejecución. Para ello es necesario construir la cadena SQL de forma dinámica.
¿Cuál debería utilizar?
Una buena respuesta en una entrevista las compara con honestidad:
- Agregación con CASE: portable, legible y compatible con cualquier motor. Es la opción predeterminada.
- SQL Server PIVOT: conciso para muchas columnas, pero su agrupación implícita puede resultar sorprendente.
- crosstab de Postgres: potente pero verboso; requiere una extensión y una lista de definición de columnas.
En caso de duda, recurra a la agregación condicional y mencione los operadores del proveedor como alternativas.
Comprobación rápida
Determine el comportamiento de SQL Server PIVOT que los entrevistadores suelen evaluar.
Resumen
Sintaxis de pivot específica del proveedor en una sola pantalla:
- SQL Server:
PIVOT (SUM(x) FOR col IN ([a],[b])), con un GROUP BY implícito sobre las columnas restantes. - Postgres:
crosstab()detablefunc, que necesita una lista de definición de columnas; use la forma de dos argumentos para datos dispersos. - MySQL: no existe ninguno de los dos; use
CASE. - Los tres requieren que las columnas se conozcan al escribir la consulta.
Preguntas frecuentes
¿La lección «Sintaxis PIVOT y de tablas cruzadas específica del proveedor» es gratis?
Sí — el texto completo de «Sintaxis PIVOT y de tablas cruzadas específica del proveedor» 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 Interview Prep, actualiza a CoddyKit PRO. El curso de SQL Interview Prep incluye 4 lecciones en total.
¿Qué aprenderé en «Sintaxis PIVOT y de tablas cruzadas específica del proveedor»?
PIVOT de SQL Server y crosstab de Postgres, junto con sus limitaciones. Practicas SQL 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 SQL Interview Prep?
No se requiere experiencia previa. SQL 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 2 de 4.
¿Cuánto tiempo toma la lección «Sintaxis PIVOT y de tablas cruzadas específica del proveedor»?
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 Interview Prep?
Sí. Cada lección de SQL 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