Comprender la función PIVOT en T-SQL

Soy muy nuevo en SQL.

Tengo una mesa como esta:

ID | TeamID | UserID | ElementID | PhaseID | Effort ----------------------------------------------------- 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

 ElementID | PhaseID1 | PhaseID5 | PhaseID6 -------------------------------------------- 3 | NULL | 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 puede explicarlo en el caso anterior (o cualquier alternativa si la hay)

Un PIVOT utilizado para rotar los datos de una columna en múltiples columnas.

Para su ejemplo, aquí hay un pivote ESTÁTICO 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 SQL con una versión funcional.

Esto también se puede hacer a través de un PIVOT dynamic donde se crea dinámicamente la lista de columnas y se ejecuta el PIVOTE.

 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 los ejemplos de pivote muy básicos que pasan amablemente.

SQL SERVER – Ejemplos de tabla PIVOT y UNPIVOT

Ejemplo del enlace de arriba 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 

Renders:

  PRODUCT FRED KATE -------------------- BEER 24 12 MILK 3 1 SODA NULL 6 VEG NULL 5 

Ejemplos similares se pueden encontrar en la publicación de blog de tablas pivote en SQL Server. Una muestra simple

Para establecer el error de compatibilidad

usa esto antes de usar la función de pivote

 ALTER DATABASE [dbname] SET COMPATIBILITY_LEVEL = 100 

Era nuevo en esto y creo una buena publicación al respecto … Mi problema era entender cómo aplicar la agregación correctamente y aquí está mi publicación: http://jaider.net/posts/1176-pivot-in-sql-server -correctos-agregados-resultados /

En la solución de @bluefeet, es importante mencionar que elementid es la columna clave de su Group By “invisible”. Además, puede reemplazar elementid o agregar más columnas como userid .

enter image description here

  SELECT , [first pivoted column] AS , [second pivoted column] AS , ... [last pivoted column] AS  FROM (