Pivot SQL by Year



嗯,有很多关于pivot SQL的引用。但是,我还是解决不了我的问题。


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

我想用动态" 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

有人对透视查询有什么想法吗?
真的感激。

尝试动态PIVOT:

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)

注:请参考@doraemon创建表并插入数据语句

您必须将初始数据UNPIVOT,然后再PIVOT

这是我找到的解决方案。看看这是否符合你的要求。

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

请试一下。谢谢你!:)

最新更新