2010-09-10 76 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