La declaración PIVOT se usa para convertir las filas de la tabla en columnas, mientras que el operador UNPIVOT convierte las columnas nuevamente en filas. Invertir una instrucción PIVOT se refiere al proceso de aplicar el operador UNPIVOT al conjunto de datos ya PIVOTADO para recuperar el conjunto de datos original.
En este artículo, estudiaremos estos tres conceptos en diferentes ejemplos.
Operador PIVOTE
Como se mencionó anteriormente, el operador PIVOT convierte las filas de la tabla en columnas. Por ejemplo, si tiene una tabla que se ve así:
y pivote por la tercera columna, el resultado será el siguiente:
En la tabla original, teníamos dos valores únicos para las columnas del curso:inglés e historia. En la tabla dinámica, estos valores únicos se han convertido en columnas. Puede ver que los valores de puntuación para cada nueva columna permanecen sin cambios. Por ejemplo, en la tabla original, una estudiante, Sally, había obtenido una puntuación de 95 en inglés, a diferencia de los valores de la tabla dinámica.
Como siempre, asegúrese de realizar una copia de seguridad segura antes de realizar cualquier ajuste en una base de datos activa.
Veamos este ejemplo de uso del operador PIVOT en SQL Server.
CREATE DATABASE School GO USE School GO CREATE TABLE Students ( Id INT PRIMARY KEY IDENTITY, StudentName VARCHAR (50), Course VARCHAR (50), Score INT ) GO INSERT INTO Students VALUES ('Sally', 'English', 95 ) INSERT INTO Students VALUES ('Sally', 'History', 82) INSERT INTO Students VALUES ('Edward', 'English', 45) INSERT INTO Students VALUES ('Edward', 'History', 78)
La secuencia de comandos anterior crea la base de datos de la escuela. En la base de datos, creamos la tabla Estudiantes con cuatro columnas, como Id, StudentName, Course y Score. Finalmente, agregamos los cuatro registros ficticios a la tabla Estudiantes.
Ahora, si usa una instrucción SELECT para recuperar todos los registros, verá lo siguiente:
Giremos esta tabla por la columna Curso. Para hacer esto, ejecute el siguiente script:
SELECT * FROM (SELECT StudentName, Score, Course FROM Students ) AS StudentTable PIVOT( SUM(Score) FOR Course IN ([English],[History]) ) AS SchoolPivot
Veamos qué está pasando en el guión. En la primera línea, usamos la declaración SELECT para definir las columnas que queremos agregar a la tabla dinámica. Las dos primeras columnas son StudentName y Score. Los datos de estas dos columnas vendrán directamente de la tabla Estudiantes. La tercera columna es Curso. Queremos PIVOTAR nuestra tabla por la columna Curso, por lo tanto, la columna Curso se dividirá en el número de columnas igual a los valores especificados por el operador PIVOT para la columna Curso.
La sintaxis del operador PIVOT es simple. Primero, debe aplicar una función agregada a la columna cuyos valores desea mostrar en las columnas pivoteadas. En nuestro caso, queremos mostrar la Puntuación en las columnas pivoteadas:Inglés e Historia. Finalmente, usamos una declaración FOR para especificar la columna pivote y los valores únicos en ella. El resultado se ve así:
Operador UNPIVOT
El operador UNPIVOT se utiliza para convertir las columnas de una tabla en filas. Por ejemplo, si tiene una tabla que se ve así:
El operador UNPIVOT devolverá los siguientes resultados:
Las columnas de la tabla original se han convertido en las filas de la tabla sin pivotar. Usemos esos datos para ver cómo funciona el operador UNPIVOT en SQL.
Para hacer esto, ejecute el siguiente script:
CREATE DATABASE School2 GO USE School2 GO CREATE TABLE Students ( Id INT PRIMARY KEY IDENTITY, StudentName VARCHAR (50), Math INT, English INT, History INT, Science INT ) GO INSERT INTO Students VALUES ('Sally', 78, 85, 91, 76 ) INSERT INTO Students VALUES ('Edward', 87, 90, 82, 87)
Si selecciona los datos de la tabla Estudiantes de la base de datos School2, verá los siguientes resultados:
Para aplicar el operador UNPIVOT a esta tabla, ejecute la siguiente consulta:
SELECT StudentName, Course, Score FROM Students UNPIVOT ( Score FOR Course in (Math, English, History, Science) ) AS SchoolUnpivot
La sintaxis del operador UNPIVOT es similar a la del PIVOT. En la instrucción SELECT, debe especificar las columnas que desea agregar a la tabla de salida. En la instrucción UNPIVOT, especificará dos columnas:
- La primera columna contiene los valores de las filas de las columnas dinámicas (que es Score en este caso).
- La segunda columna incluye los nombres de las columnas dinámicas, es decir, Matemáticas, Inglés, Historia y Ciencias.
La tabla de salida se verá así:
Invertir un PIVOTE
Invertir un operador PIVOT se refiere al proceso de aplicar el operador UNPIVOT a una tabla dinámica para volver a la tabla original.
Reversión de tabla dinámica no agregada
Solo es posible invertir un operador PIVOT si la tabla dinámica no contiene datos agregados.
Miremos la tabla que usamos en la sección PIVOT de este artículo.
Puede ver que no hay filas repetidas. En otras palabras, podemos decir que para cada estudiante solo hay un registro por curso. Por ejemplo, Sally solo tiene un registro de su puntuación en el curso de inglés.
Cuando aplicamos el operador PIVOT a la tabla anterior, obtuvimos el siguiente resultado:
Ahora, aplicaremos el operador UNPIVOT a este resultado y veremos si podemos volver a la tabla original. Para hacer esto, ejecute el siguiente script:
Podemos ejecutar esta consulta en la base de datos School que creamos en la sección del operador PIVOT.
SELECT StudentName, Course, Score FROM (SELECT * FROM (SELECT StudentName, Score, Course FROM Students ) AS StudentTable PIVOT( SUM(Score) FOR Course IN ([English],[History]) ) AS SchoolPivot) PivotedResults UNPIVOT ( Score FOR Course in (English, History) ) AS Schoolunpivot
Aquí usamos una subconsulta para aplicar el operador UNPIVOT a los datos pivotados. La consulta interna emplea el operador PIVOT, mientras que la consulta externa usa el operador UNPIVOT. En la salida, verá la tabla de Estudiantes original.
Tabla dinámica agregada inversa
Dijimos anteriormente que solo es posible revertir un operador PIVOT que no contiene datos agregados. Intentemos revertir la instrucción PIVOT que contiene datos agregados.
Agregue otro registro a la tabla de Estudiantes de la base de datos Escuela que creamos en la primera sección de este artículo. Para hacer esto, ejecute la siguiente consulta:
INSERT INTO Students VALUES ('Edward', 'History', 78)
Ahora, si selecciona todos los registros de la tabla Estudiantes, obtendrá el siguiente resultado:
Podemos ver que tenemos un registro duplicado para la puntuación de Edward en Historial.
Ahora, aplique el operador PIVOT a esta tabla.
SELECT Id, StudentName, English, History FROM Students PIVOT ( SUM (Score) FOR Course in (English, History) ) AS Schoolpivot
A partir de la salida, puede ver que la función SUMA en el operador PIVOT ha agregado dos puntajes al curso de Historia tomado por Edward. Si intenta invertir el pivote de esta tabla (es decir, aplica el operador UNPIVOT), no recibirá la tabla original. Devolverá los cuatro registros en lugar de los cinco originales. La columna Historial del estudiante Edward contendrá el resultado agregado en lugar de los resultados individuales.
Para ver esto, ejecute el siguiente script:
SELECT StudentName, Course, Score FROM (SELECT * FROM (SELECT StudentName, Score, Course FROM Students ) AS StudentTable PIVOT( SUM(Score) FOR Course IN ([English],[History]) ) AS SchoolPivot) PivotedResults UNPIVOT ( Score FOR Course in (English, History) ) AS Schoolunpivot
La tabla de salida se verá así:
Referencias:
- Microsoft:uso de PIVOT y UNPIVOT
- Codingsight:uso de PIVOT en SQL
- YouTube:video PIVOT inverso