/ / Pivot SQL por año - sql, sql-server, sql-server-2008-r2

Pivot SQL por año - sql, sql-server, sql-server-2008-r2

Bueno, hay una gran cantidad de referencias para pivot SQL. Pero aún así, no pude resolver mi problema.

Tengo la siguiente tabla:

-----------------------------------------------------------------------
InspectYear     PartNo    PartDesc    A       B      C     D
-----------------------------------------------------------------------
2015            001       Part 1      9       8      8     6
2015            002       Part 2      8       8      8     6
2014            001       Part 1      9       2      8     6
2014            002       Part 2      8       8      8     4

Quiero tener el siguiente resultado con dinámico "InspectYear":

-----------------------------------------------------------------------
PartNo    PartDesc  NewCol        2014    2015
-----------------------------------------------------------------------
001       Part 1    A             9       9
001       Part 1    B             2       8
001       Part 1    C             8       8
001       Part 1    D             6       6
002       Part 2    A             8       8
002       Part 2    B             8       8
002       Part 2    C             8       8
002       Part 2    D             4       6

¿Alguien tiene una idea para la consulta de pivote?
muy apreciado.

Respuestas

1 para la respuesta № 1

Intente a continuación PIVOT dinámico:

DECLARE @InspectYear AS NVARCHAR(MAX),@Query  AS NVARCHAR(MAX);

SET @InspectYear = STUFF((SELECT distinct "," + QUOTENAME(InspectYear)
FROM table4 c
FOR XML PATH(""), TYPE
).value(".", "NVARCHAR(MAX)")
,1,1,"")

SET @Query =
";WITH data AS
(
SELECT InspectYear, PartNo, PartDesc, NewCol, number
FROM table4
UNPIVOT
(
number
FOR NewCol IN (A, B, C,D)
) AS unpvt
)
SELECT *
FROM data
PIVOT
(
SUM(number)
FOR InspectYear IN ( "+@InspectYear+" )
) AS pvt
ORDER BY PartNo, PartDesc, NewCol "

EXECUTE(@query)

Nota: Consulte @doraemon Crear tabla e insertar declaración de datos


0 para la respuesta № 2

Tienes que UNPIVOT sus datos iniciales y luego otra vez PIVOT eso.

Aquí está la solución que encontré. Ver si esto cumple con su requisito.

CREATE TABLE table4
(
InspectYear INT,
PartNo VARCHAR(5),
PartDesc VARCHAR(30),
A INT,
B INT,
C INT,
D INT
)

INSERT INTO table4 VALUES
(2015, "001", "Part 1", 9, 8, 8, 6),
(2015, "002", "Part 2", 8, 8, 8, 6),
(2014, "001", "Part 1", 9, 2, 8, 6),
(2014, "002", "Part 2", 8, 8, 8, 4)

;WITH data AS
(
SELECT InspectYear, PartNo, PartDesc, NewCol, number
FROM table4
UNPIVOT
(
number
FOR NewCol IN (A, B, C,D)
) AS unpvt
)
SELECT *
FROM data
PIVOT
(
SUM(number)
FOR InspectYear IN ( [2014], [2015] )
) AS pvt
ORDER BY PartNo, PartDesc, NewCol

Por favor, tenga una oportunidad. Gracias. :)