sql >> Base de Datos >  >> RDS >> Sqlserver

Por favor explique las partes de un PIVOT

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