Explicación de la consulta dinámica
FROM
(SELECT OtherID, Val, amount
FROM @randomTable) p
Estas son las columnas que se convierten en los "datos base" para el pivote. No incluya columnas que no hagan nada. Así como no coloca columnas que no sean GROUP BY en la cláusula SELECT, no enumera las columnas no utilizadas en una fuente PIVOT.
PIVOT
(
max(amount)
FOR Val IN (Val1, Val2, Val3, Val4, Val5)
) AS PivotTable;
Esta parte dice que está creando 5 nuevas columnas llamadas "Val1" a "Val5". Estos nombres de columna representan valores en la columna Val. Por lo tanto, se espera que su tabla contenga algo como esto
otherID Val amount
1 Val1 1
2 Val2 2
1 Val3 3
1 Val1 5
(etc) (this column contains one of Val1 - Val5, or null)
Así que ahora tiene 5 columnas nuevas que no existían antes. ¿Qué va en la columna?
- Cualquier columna que aparezca en la SALIDA que no sea una columna PIVOTADA es una columna "GRUPO POR".
- La función agregada es lo que recopila todos los datos en la celda que es el CRUZ entre las columnas GROUP BY y la columna PIVOTED.
Entonces, para ilustrar, usando los datos de muestra anteriores, tenemos otherID=1 y val=Val1. En la tabla de salida, solo hay una celda que representa esta combinación de Max(amount) para cada combinación (otherID/val)
otherID Val1 Val2 Val3 Val4 Val5
1 <x> ... ... ... ...
(etc)
Para la celda marcada <x>
, solo se permite un valor, por lo que <x>
no puede contener múltiples amount
valores. Esa es la razón por la que necesitamos agregarlo, en este caso usando MAX(amount)
. Entonces, de hecho, la salida se ve así
(unpivoted columns) (pivoted, creates "new" columns)
otherID | Val1 Val2 Val3 Val4 Val5
1 | MAX(amount) Max(amount) << cell value = aggregate function
(etc)
La declaración SELECT es lo que genera estas columnas
SELECT OtherID, Val1, Val2, Val3, Val4, Val5