1

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

ご協力いただきありがとうございます!

4

2 に答える 2

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
于 2010-09-10T17:15:57.490 に答える
0

動的バージョンを介してこれを行いたいというコメントに基づいています。Martin のバージョンを静的バージョンに使用できますが、動的バージョンが必要な場合、つまり数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フィドルです

于 2012-06-19T19:46:12.450 に答える