2016-10-24 8 views
1

ピボットを使用して列を列に変換したい。カラムが2つしかない場合は、それを行うことができます。テーブルに2つ以上のカラムがある場合、ピボットできるのでしょうか?例えば2列以上の列に行を変換するSQL Server

C1 C2  C3 
________________________ 
    A 10  1000 
    B 20  1000 
    C 30  1500 

予想される出力:

A   B  C 
10  20  30 
1000  1000  1500 
+0

https://blogs.msdn.microsoft.com/kenobonn/2009/03/22/pivot-on-two-or-more-fields- in-SQL-server / –

答えて

0

これは、私もあなたの代わりに、複雑なCTEの

WITH cte 
     AS (SELECT Max(a) a, 
        Max(b) b, 
        Max(c) c 
      FROM (SELECT * 
        FROM #Table1)a 
        PIVOT (Avg(c2) 
          FOR c1 IN (a, 
            b, 
            c)) AS c), 
     c2 
     AS (SELECT Max(a) a, 
        Max(b) b, 
        Max(c) c 
      FROM (SELECT * 
        FROM #Table1)a 
        PIVOT (Avg(c3) 
          FOR c1 IN (a, 
            b, 
            c)) AS c3) SELECT * 
    FROM cte 
    UNION ALL 
    SELECT * 
    FROM c2 
0

を使用しての1つのピボットで試すことができた一つの方法ですPIVOTとテーブル値コンストラクタを使用する簡単な方法はここにあります

CREATE TABLE myTable 
    ([C1] varchar(1), [C2] int, [C3] int) 
; 

INSERT INTO myTable 
    ([C1], [C2], [C3]) 
VALUES 
    ('A', 10, 1000), 
    ('B', 20, 1000), 
    ('C', 30, 1500) 
; 


SELECT [A],[B],[C] 
FROM (
     SELECT ca.* 
     FROM myTable mt 
       CROSS APPLY (VALUES(mt.C1, 1, mt.C2),(mt.C1, 2, mt.C3)) ca(col, rn, val) 
     ) t 
PIVOT (
    MAX(val) 
    FOR col IN ([A],[B],[C]) 
) p 

クロス列ごとに新しい行を作成する適用(C2、C3)はcol PIVOTを組み合わせないように(Aは、B、C)rnの値を分離するだけRowNumber関数値であり、C1の値です。それらを選び、ちょうどMAXを選び、valはC2とC3の値だけです