2010-09-10 131 views
1

我一直在閱讀PIVOT上的一個UNPIVOT,但一直未能正確格式化結果來顯示數據。這裏是我的源表:使用PIVOT/UNPIVOT將行轉換爲列

StepID   |  ShortDesc  |  Type_1  |  ar1  | ar2 
    1     ShortDesc1   10    11.11   11.01 
    2     ShortDesc2   20    22.22   22.02 
    3     ShortDesc3   30    33.33   33.03 
    4     ShortDesc4   40    44.44   44.04 
    5     ShortDesc5   50    55.55   55.05   

這裏是我想達到的效果:

|  Step1  |  Step2  |  Step3  |  Step4  |  Step5 
     ShortDesc1   ShortDesc2  ShortDesc3  ShortDesc4  ShortDesc5 
     10     20    30    40    50 
     11.11    22.22    33.33   44.44   55.55 
     11.01    22.02    33.03   44.04   55.05 

下面是最新的什麼我都試過了,當然沒有工作:

DROP TABLE ProductionTest 
CREATE TABLE ProductionTest (StepID int, ShortDesc nvarchar(25), Type_1 int, ar1 real, ar2 real) 
INSERT INTO ProductionTest VALUES (1, 'Short Desc 1', 10, 11.11, 11.01) 
INSERT INTO ProductionTest VALUES (2, 'Short Desc 2', 20, 22.22, 22.02) 
INSERT INTO ProductionTest VALUES (3, 'Short Desc 3', 30, 33.33, 33.03) 
INSERT INTO ProductionTest VALUES (4, 'Short Desc 4', 40, 44.44, 44.04) 
INSERT INTO ProductionTest VALUES (5, 'Short Desc 5', 50, 55.55, 55.05) 

SELECT * FROM ProductionTest 

SELECT [1]as Step1, [2] as Step2, [3]as Step3, [4]as Step4, [5]as Step5 
FROM  (SELECT [StepID], ShortDesc, Type_1, ar1, ar2 
      FROM ProductionTest) p 
PIVOT (MAX(ShortDesc) 
        FOR StepID IN ([1], [2], [3], [4], [5]) 
     ) AS pvt 

感謝您的幫助!

+0

+1有用的DDL – 2010-09-10 17:06:28

回答

0

數據透視不旋轉整個表格。我想你會需要像

SELECT [1]as Step1, [2] as Step2, [3]as Step3, [4]as Step4, [5]as Step5 
FROM  (SELECT [StepID], ShortDesc 
      FROM ProductionTest) p 
PIVOT (MAX(ShortDesc) 
        FOR StepID IN ([1], [2], [3], [4], [5]) 
     ) AS pvt 

UNION ALL 

SELECT [1]as Step1, [2] as Step2, [3]as Step3, [4]as Step4, [5]as Step5 
FROM  (SELECT [StepID], CAST(Type_1 AS nvarchar(25)) AS Type_1 
      FROM ProductionTest) p 
PIVOT (MAX(Type_1) 
        FOR StepID IN ([1], [2], [3], [4], [5]) 
     ) AS pvt 

UNION ALL 

SELECT [1]as Step1, [2] as Step2, [3]as Step3, [4]as Step4, [5]as Step5 
FROM  (SELECT [StepID], CAST(ar1 AS nvarchar(25)) AS ar1 
      FROM ProductionTest) p 
PIVOT (MAX(ar1) 
        FOR StepID IN ([1], [2], [3], [4], [5]) 
     ) AS pvt 

UNION ALL 

SELECT [1]as Step1, [2] as Step2, [3]as Step3, [4]as Step4, [5]as Step5 
FROM  (SELECT [StepID], CAST(ar2 AS nvarchar(25)) AS ar2 
      FROM ProductionTest) p 
PIVOT (MAX(ar2) 
        FOR StepID IN ([1], [2], [3], [4], [5]) 
     ) AS pvt 
+0

謝謝,這樣的作品,雖然definetely更復雜的話,我orginally認爲這將是。你的權利,我真正需要做的是'翻轉'桌子。這給了我一個很好的起點。再次感謝!! – 2010-09-10 18:39:33

+0

其實,如果可以的話,我會跟進一個問題。這種動態vs靜態有多難?我最初的想法是創建一個數據庫視圖和/或存儲過程。你怎麼看? – 2010-09-10 18:42:23

0

根據您的評論,你想通過動態版本做到這一點。您可以使用馬丁的版本靜態版本,但如果你想有一個動態的,這意味着的StepID's數量會再改,你可以做到以下幾點:

DECLARE @cols AS NVARCHAR(MAX), 
    @colsAlias AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX); 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(StepID) 
        from ProductionTest 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

SELECT @colsAlias = STUFF((SELECT DISTINCT ',' + QUOTENAME(p.StepID) + ' AS ' + QUOTENAME('Step' + Cast(p1.StepID as varchar(10))) 
    FROM ProductionTest p INNER JOIN ProductionTest p1 ON p.StepID = p1.StepID 
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'') 


set @query = 'SELECT ' + @colsAlias + ' from 
      (
       select [StepID], ShortDesc 
       FROM ProductionTest 
      ) x 
      pivot 
      (
       MAX(ShortDesc) 
       for stepId in (' + @cols + ') 
      ) p 
      UNION ALL 
      SELECT ' + @colsAlias + ' from 
      (
       select [StepID], CAST(Type_1 AS nvarchar(25)) AS Type_1 
       FROM ProductionTest 
      ) x 
      pivot 
      (
       MAX(Type_1) 
       for stepId in (' + @cols + ') 
      ) p 
      UNION ALL 
      SELECT ' + @colsAlias + ' from 
      (
       select [StepID], CAST(ar1 AS nvarchar(25)) AS ar1 
       FROM ProductionTest 
      ) x 
      pivot 
      (
       MAX(ar1) 
       for stepId in (' + @cols + ') 
      ) p 
      UNION ALL 
      SELECT ' + @colsAlias + ' from 
      (
       select [StepID], CAST(ar2 AS nvarchar(25)) AS ar2 
       FROM ProductionTest 
      ) x 
      pivot 
      (
       MAX(ar2) 
       for stepId in (' + @cols + ') 
      ) p ' 

execute (@query) 

查詢仍然是複雜的,但列將被創建的時候查詢運行。

這裏是一個SQL Fiddle with a Demo