2016-10-19 227 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