SQLShack

En este artículo, explicaremos los operadores Pivote y Unpivot SQL y cómo pueden ser útiles para transponer datos de SQL Server. Además, analizaremos formas estáticas y dinámicas de usar operadores relacionales PIVOT y UNPIVOT que se pueden usar para transformar valores distintos agregados como columna(s) en el conjunto de resultados especificando todos los valores de columna en la cláusula PIVOT IN.

Introducción al pivote de SQL Server

Hay varias formas de transponer un conjunto de datos de filas a columnas y de columnas a filas. Pivote SQL es una de las técnicas que permite la transposición de filas a columnas y realiza posibles agregaciones a lo largo del camino. Los operadores relacionales SQL PIVOT y SQL UNPIVOT transponen datos bidimensionales con valor de tabla a otra forma de datos. SQL PIVOT transpone una expresión con valores de tabla de un conjunto único de valores de una columna a varias columnas en el resultado y realiza agregaciones. SQL UNPIVOT realiza la operación opuesta a SQL PIVOT al transformar las columnas de una expresión con valores de tabla en valores de columna.

En la mayoría de los casos, la técnica de pivote estático basta con el requisito de negocio. Por ejemplo, el pronóstico de ventas mensuales, la división de ventas anuales, la agregación de ventas trimestrales, etc., donde las columnas de la cláusula IN permanecen estáticas. En algunos otros casos, necesitamos detalles granulares y la expresión de valor de tabla es de naturaleza más dinámica y todo el tiempo se incluye un nuevo conjunto de expresión en la tabla, entonces dynamic PIVOT sería la mejor opción.

Nota: En la representación anterior, podemos ver que en el proceso de PIVOTE, los valores de columna se giran de vertical a horizontal y DESEMPOLVAR es como girarlo de horizontal a vertical.

Syntax

SELECT <non-pivoted column>,

AS <column alias>,

AS <column alias>,

AS <column alias>

FROM

(

<SELECT QUERY>)

AS <Alias for temporary data set>

PIVOT

(

<Aggregate function>( Aggregate column)

FOR

IN ( , ,

… )

) AS <tabla dinámica alias>

< cláusula ORDER BY>;

introducción a SQL Pivote

vamos a empezar con giros y onu-pivotante de los datos. A estas alturas ya comprende qué operadores PIVOTE y UNPIVOT son en SQL Server. En términos simples, es solo otra forma de describir el proceso de convertir valores de fila distintos en sus propias columnas que se conoce como Pivotar. Y el proceso de convertir columnas en filas se conoce como un no pivotante.

Ejemplo 1: Cómo realizar una operación Pivote SQL

Imaginemos el conjunto de datos de muestra derivado de la base de datos AdventureWorks2014. En este caso, acaba de obtener un conjunto de datos simple con la columna Año de venta a lo largo de un valor cuantitativo de ventas totales.

Ahora, el conjunto de datos está listo para girar. Tienes Año de venta en la primera columna, Ventas totales en la segunda columna. Si solicitó transponer los datos, debe tomar cada año distinto en la columna y estas columnas se convierten en el encabezado de las columnas pivotantes. Así, 2011 se convierte en la primera columna, 2012 se convierte en su propia columna y así sucesivamente. Los valores reales de las ventas totales de la siguiente columna, se adhieren a los encabezados de columna pivotante. Ahora, la tabla pivotante se vería como a continuación.

1
2
3
4
5
6
7
8
9
10

SELECT * FROM
(
SELECCIONE el AÑO(SOH.Fecha de pedido) como año de venta,
SOH.SubTotal como ventas totales
DE ventas.SalesOrderHeader SOH
ÚNASE A ventas.Pedido de ventas por encargo DE SOH.SalesOrderID = SOD.SalesOrderID
) COMO Ventas
PIVOT (SUMA(ventas totales)
PARA EL año DE venta EN (,,,))
como PVT

La siguiente imagen muestra los datos de entrada, Pivot sintaxis, pivote SQL y resultados de salida.

Ejemplo 2: Cómo realizar una operación SQL Unpivot

Veamos ahora en la otra dirección, un-pivotar, que es tan simple como pasar de horizontal a vertical. En este caso, tomaría todas esas columnas distintas que están seleccionadas y convertiría esos encabezados de columna en sus propias filas. Pivotar es como girar de vertical a horizontal. Y no pivotar es como girar de horizontal a vertical.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

SELECCIONE SalesYear,
TotalSales
DE la
(
SELECT *
DE la
(
SELECCIONE el AÑO(SOH.Fecha de pedido) COMO año de venta,
SOH.SubTotal COMO ventas totales
DE ventas.SalesOrderHeader SOH
ÚNASE A ventas.Pedido de ventas por encargo DE SOH.SalesOrderID = SOD.SalesOrderId
) COMO las Ventas de PIVOTE(SUM(TotalSales) PARA SalesYear EN(,
,
,
)) COMO PVT
) T UNPIVOT(TotalSales PARA SalesYear EN(,
,
,
)) COMO upvt;

En el siguiente ejemplo, el conjunto de datos dinamizado se utiliza para onu-pivote de los valores. La pieza clave aquí es que esto fue fácil de hacer para transformarse porque pudimos crear una tabla dinámica como un paso intermedio y luego hacer la transformación utilizando la operación unpivot.

Nota: La operación de pivote SQL da como resultado la transposición del resultado agregado a la columna, pero mientras que SQL unpivot no es una inversión exacta de transponer columnas a los valores segregados de filas. El operador unpivot no dividirá los resultados agregados.

Ejemplo 3: Cómo obtener ventas trimestrales utilizando la operación pivote SQL

Veamos algunos ejemplos más para comprender mejor los conceptos de pivote. En este caso, veremos cómo obtener datos de ventas trimestrales agregados en función de las ventas trimestrales.

Antes de entrar en la solución, siempre se recomienda trabajar en la creación de un conjunto de datos para la operación PIVOTE.

El siguiente ejemplo muestra las ventas mensuales agregadas repartidas a lo largo del año de venta.

1
2
3
4
5
6
7
8
9

SELECCIONE el AÑO(SOH.Fecha de pedido) COMO año de venta,
MES (SOH.OrderDate) COMO SalesMonth,
SUM (SOH.SubTotal) COMO ventas totales
DE ventas.SalesOrderHeader SOH
ÚNASE A ventas.Pedido de ventas por encargo DE SOH.SalesOrderID = SOD.SalesOrderID
GRUPO POR AÑO(SOH.Fecha de pedido),
MES (SOH.Fecha de pedido)
ORDENAR POR AÑO (SOH.Fecha de pedido),
MES (SOH.Fechapedido);

El siguiente resultado muestra la base de datos

una Vez que esté listo con la base de datos, se puede aplicar el operador PIVOT. En el siguiente ejemplo, la cláusula IN acepta un carácter no numérico que se genera en función del valor de la parte de DATOS. El valor de la parte de datos se concatena con ‘ Q ‘ y luego los valores se alimentan en la cláusula del operador de PIVOTE.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

SELECCIONE SalesYear,
ISNULL(, 0) Q1,
ISNULL(, 0), P2,
ISNULL(, 0), P3,
ISNULL(, 0), P4,
(ISNULL(, 0) + ISNULL(, 0) + ISNULL(, 0) + ISNULL(, 0)) SalesYTD
DE
(
SELECCIONE el AÑO(SOH.Fecha de pedido) COMO año de venta,
CAST (‘Q’ + CAST (DATEPART (QUARTER, SOH.OrderDate) COMO VARCHAR(1)) COMO VARCHAR(2)) Quarters,
SOH.SubTotal COMO ventas totales
DE ventas.SalesOrderHeader SOH
ÚNASE A ventas.Pedido de ventas por encargo DE SOH.SalesOrderID = SOD.SalesOrderId
) COMO Datos de PIVOTE(SUM(TotalSales) PARA los Trimestres EN(,
,
,
)) COMO pvt
PEDIDO POR SalesYear;

La siguiente salida es una división trimestral de los datos de ventas

Ejemplo 4: Cómo obtener ventas mensuales mediante una operación pivot SQL

Echemos un vistazo a otro ejemplo para ver los datos de ventas divididas en función de cada mes. En el siguiente ejemplo, los valores de la cláusula IN se generan como parte de la función DATEPART. Los valores de la parte de datos se alimentan en la cláusula del operador de PIVOTE.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

SELECCIONE SalesYear,
Isnull(, 0) como Jan,
Isnull(, 0) como la Feb,
Isnull(, 0) como el Mar,
ISNULL(, 0) como Apr,
isnull(, 0) como se Puede,
isnull(, 0) como Jun,
isnull(, 0) como de Jul,
isnull(, 0) como Ago,
isnull(, 0) como Sep,
ISNULL(, 0) como Oct,
isnull(, 0) como Nov,
isnull(, 0) como Dec,
(isnull(, 0) + isnull(, 0) + ISNULL(, 0) + isnull(, 0) + isnull(, 0) + isnull(, 0) + ISNULL(, 0) + ISNULL(, 0) + isnull(, 0) + isnull(, 0) +isnull (, 0) + isnull (, 0) + isnull (, 0) + ISNULL(, 0) + ISNULL(, 0) + ISNULL(, 0)) SalesYTD
DE la
(
SELECCIONE el AÑO(SOH.Fecha de pedido) COMO Año de venta,
DATEPART (MES, SOH.Fechapedido) Meses,
SOH.SubTotal COMO ventas totales
DE ventas.SalesOrderHeader SOH
ÚNASE A ventas.Pedido de ventas por encargo DE SOH.SalesOrderID = SOD.SalesOrderId
) COMO Datos de PIVOTE(SUM(TotalSales) PARA los Meses EN los(,
,
,
,
,
,
,
,
,
,
,
)) COMO pvt;

La siguiente salida es una división mensual de los datos de ventas

Ejemplo 5: Cómo obtener ventas mensuales utilizando la operación dinámica de pivote SQL

división mensual de los datos de ventas mediante pivote dinámico. Hasta ahora, hemos discutido las operaciones de pivote estático. Para convertir una operación de pivote estático a dinámico, debemos eliminar los valores codificados de la cláusula IN. En primer lugar, obtenga la expresión distinta del conjunto de datos y, a continuación, prepare una cadena concatenando todas las expresiones. En el ejemplo siguiente, el @columnname se usa para concatenar toda la expresión. La expresión concatenada se alimenta a la cláusula pivot IN. El resto es una conversión simple de SQL estático en SQL dinámico y llamar a @DML utilizando el procedimiento almacenado sp_executesql.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

INDICANDO @dml COMO NVARCHAR(MAX)
DECLARADO @ColumnName AS NVARCHAR (MAX)
SELECT @ColumnName= ISNULL(@ColumnName+’,’,»)
+ QUOTENAME(Months)
FROM (SELECT DISTINCT DATEPART(MONTH, SOH.Fecha de pedido) Meses
DE ventas.SalesOrderHeader SOH
ÚNASE A ventas.Pedido de ventas por encargo DE SOH.SalesOrderID = SOD.SalesOrderID
GRUPO POR AÑO(SOH.Fecha de pedido),
DATEPART (MES, SOH.OrderDate)) COMO Meses
Prepare Prepare la consulta de PIVOTE utilizando la dinámica
SET @dml =
N’SELECT SalesYear, ‘+@ColumnName + ‘ DE
(
SELECCIONE AÑO (SOH.Fecha de pedido) COMO Año de venta,
DATEPART (MES, SOH.Fecha de pedido) Meses,
SUMA (SOH.SubTotal) COMO ventas totales
DE ventas.SalesOrderHeader SOH
ÚNASE A ventas.Pedido de ventas por encargo DE SOH.SalesOrderID = SOD.SalesOrderID
GRUPO POR AÑO(SOH.Fecha de pedido),
DATEPART (MES, SOH.OrderDate)) COMO T
PIVOT(SUMA(ventas totales)
DURANTE meses EN (‘ + @ColumnName + ‘)) COMO PVTTable’
Print Imprimir @DynamicPivotQuery
Execute Ejecutar la consulta Dinámica de pivote
EXEC sp_executesql @dml

Eso es todo por ahora

Terminando

Hasta ahora, hemos demostrado los conceptos básicos y varios ejemplos de SQL PIVOT y SQL UNPIVOT.

El ejemplo se basa en la base de datos SQL Server adventureworks2014. Puede probar y probar todas las muestras usted mismo. Si tiene alguna pregunta, no dude en comentar a continuación

  • Autor
  • Publicaciones recientes
Prashanth Jayaram
Soy un tecnólogo de bases de datos con más de 11 años de experiencia práctica en tecnologías de bases de datos. Soy Profesional Certificado por Microsoft y con el respaldo de un Título en Maestría en Aplicaciones Informáticas.
Mi especialidad es diseñar & implementar soluciones de alta disponibilidad y migración de bases de datos multiplataforma. Las tecnologías en las que se trabaja actualmente son SQL Server, PowerShell, Oracle y MongoDB.Ver todas las publicaciones de Prashanth Jayaram
Prashanth Jayaram
Últimas publicaciones de Prashanth Jayaram (ver todas)
  • Un resumen rápido de la auditoría de base de datos en SQL – 28 de enero de 2021
  • Cómo configurar la sincronización de datos de Azure entre las bases de datos SQL de Azure y el servidor SQL local-20 de enero de 2021
  • Cómo realizar operaciones de importación/exportación de bases de datos SQL de Azure con PowerShell – 14 de enero de 2021

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *