Comprender la función PIVOT en T-SQL

Resuelto Web-E asked hace 12 años • 7 respuestas

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).

Web-E avatar May 03 '12 16:05 Web-E
Aceptado

A PIVOTse 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
Taryn avatar May 03 '2012 10:05 Taryn

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

Shaikh Farooque avatar May 03 '2012 09:05 Shaikh Farooque