Comprender la función PIVOT en T-SQL
Soy muy nuevo en SQL.
Tengo una mesa como esta:
IDENTIFICACIÓN | ID de equipo | ID de usuario | ID de elemento | ID de fase | Esfuerzo |
---|---|---|---|---|---|
1 | 1 | 1 | 3 | 5 | 6.74 |
2 | 1 | 1 | 3 | 6 | 8.25 |
3 | 1 | 1 | 4 | 1 | 2.23 |
4 | 1 | 1 | 4 | 5 | 6.8 |
5 | 1 | 1 | 4 | 6 | 1.5 |
Y me dijeron que obtuviera datos como este.
ID de elemento | ID de fase1 | FaseID5 | FaseID6 |
---|---|---|---|
3 | NULO | 6.74 | 8.25 |
4 | 2.23 | 6.8 | 1.5 |
Entiendo que necesito usar la función PIVOT. Pero no puedo entenderlo claramente. Sería de gran ayuda si alguien pudiera explicarlo en el caso anterior (o cualquier alternativa, si corresponde).
A PIVOT
se utiliza para rotar los datos de una columna a varias columnas.
Para su ejemplo, aquí hay un pivote ESTÁTICO, lo que significa que codifica las columnas que desea rotar:
create table temp
(
id int,
teamid int,
userid int,
elementid int,
phaseid int,
effort decimal(10, 5)
)
insert into temp values (1,1,1,3,5,6.74)
insert into temp values (2,1,1,3,6,8.25)
insert into temp values (3,1,1,4,1,2.23)
insert into temp values (4,1,1,4,5,6.8)
insert into temp values (5,1,1,4,6,1.5)
select elementid
, [1] as phaseid1
, [5] as phaseid5
, [6] as phaseid6
from
(
select elementid, phaseid, effort
from temp
) x
pivot
(
max(effort)
for phaseid in([1], [5], [6])
)p
Aquí hay una demostración de SQL con una versión funcional.
Esto también se puede hacer a través de un PIVOT dinámico donde se crea la lista de columnas dinámicamente y se realiza el PIVOT.
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX);
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.phaseid)
FROM temp c
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT elementid, ' + @cols + ' from
(
select elementid, phaseid, effort
from temp
) x
pivot
(
max(effort)
for phaseid in (' + @cols + ')
) p '
execute(@query)
Los resultados para ambos:
ELEMENTID PHASEID1 PHASEID5 PHASEID6
3 Null 6.74 8.25
4 2.23 6.8 1.5
Estos son el ejemplo de pivote muy básico. Por favor, repáselo.
SERVIDOR SQL: ejemplos de tablas PIVOT y UNPIVOT
Ejemplo del enlace anterior para la tabla de productos:
SELECT PRODUCT, FRED, KATE
FROM (
SELECT CUST, PRODUCT, QTY
FROM Product) up
PIVOT (SUM(QTY) FOR CUST IN (FRED, KATE)) AS pvt
ORDER BY PRODUCT
renderiza:
PRODUCT FRED KATE
--------------------
BEER 24 12
MILK 3 1
SODA NULL 6
VEG NULL 5
Se pueden encontrar ejemplos similares en la publicación del blog Tablas dinámicas en SQL Server. Una muestra sencilla