2016-10-19 239 views
-1

那么,有很多关于枢轴SQL的引用。但是,我仍然无法解决我的问题。
枢轴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 

没有人有枢轴查询的想法?
非常感谢。

回答

1

尝试下面的动态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 ('[email protected]+') 
) AS pvt 
ORDER BY PartNo, PartDesc, NewCol ' 

EXECUTE(@query) 

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

+1

是的!这项工作!我正在写查询...... :) – Doraemon

+1

男人。你是冠军! – Haminteu

0

你必须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 

请试一试。谢谢。 :)

+0

完美的一个解决方案 –

+0

您好,感谢这一点。但是这个是静态的关键。我需要动态的..因为总是添加'InspectYear'字段。 – Haminteu