2017-04-19 7 views
1

ピボットに関する簡単な質問。私は、次のデータを持っている:さらに別のSQLピボット

c1 | c2 | c3 | c4 | c5 
pk1 | r12 | r13 | r14 | r15 
pk2 | r22 | r23 | r24 | r25 
pk3 | r32 | r33 | r34 | r35 

私はケースの列c1が主キーである、私の例では

[c1] | pk1 | pk2 | pk3 
c2 | r12 | r22 | r32 
c3 | r13 | r23 | r33 
c4 | r14 | r24 | r34 
c5 | r15 | r25 | r35 

に従うとして、それを回転させるようにしたいと思います。 ご協力いただきありがとうございます。

PS:私はそれまでそれをもう一度与えます。

+1

が、これは目的を報告するためですか?その場合は、レポートツールでこれを実行する必要があります。そうでない場合は、最初の課題は列名をデータ値として取得することです。列C1〜C5は固定されていますか?これらは行としてコード化することができますか?この表には固定数の行がありますか?千の行がある場合、千の列に変換したいと言います。 –

+0

列は固定されています(50個)。一方、行は柔軟であり、事前にはわかっていません(1000行では50行の1000列が生成されます) –

答えて

1

UNPIVOT次にPIVOTテーブルです。 これはhardcodeバージョンです。

DECLARE @SampleData AS TABLE 
(
    c1 varchar(10), 
    c2 varchar(10), 
    c3 varchar(10), 
    c4 varchar(10), 
    c5 varchar(10) 
) 

INSERT INTO @SampleData 
VALUES 
('pk1', 'r12','r13','r14','r15'), 
('pk2', 'r22','r23','r24','r25'), 
('pk3', 'r32','r33','r34','r35') 

;with pvt AS 
    (
    SELECT c1, ColName, Value 
    FROM 
    (
     SELECT * FROM @SampleData sd 
    ) src 
    UNPIVOT 
    (
     Value FOR ColName IN (c2,c3,c4,c5) 
    ) pvt 
) 

SELECT ColName AS [c1], [pk1], [pk2], [pk3] 
FROM 
(
    SELECT * FROM pvt p 
) src 
PIVOT 
(
    Max(Value) FOR c1 IN ([pk1], [pk2], [pk3]) 
) pvt 

デモへのリンク:Rextester

+0

ありがとうございます。 –

0

これは長くて醜いですが、データをピボットします。

WITH pk1 AS (
SELECT c1,c2 'pk1' 
FROM Table_1 
WHERE c1 = 'pk1' 
UNION 
SELECT c1,c3 'pk1' 
FROM Table_1 
WHERE c1 = 'pk1' 
UNION 
SELECT c1,c4 'pk1' 
FROM Table_1 
WHERE c1 = 'pk1' 
UNION 
SELECT c1,c5 'pk1' 
FROM Table_1 
WHERE c1 = 'pk1'), 
pk1_rn AS 
(SELECT ROW_NUMBER() OVER(PARTITION BY c1 ORDER BY pk1 ASC) AS Row#, pk1 
FROM pk1), 

pk2 AS (
SELECT c1,c2 'pk2' 
FROM Table_1 
WHERE c1 = 'pk2' 
UNION 
SELECT c1,c3 'pk2' 
FROM Table_1 
WHERE c1 = 'pk2' 
UNION 
SELECT c1,c4 'pk2' 
FROM Table_1 
WHERE c1 = 'pk2' 
UNION 
SELECT c1,c5 'pk2' 
FROM Table_1 
WHERE c1 = 'pk2'), 
pk2_rn AS 
(SELECT ROW_NUMBER() OVER(PARTITION BY c1 ORDER BY pk2 ASC) AS Row#, pk2 
FROM pk2), 

pk3 AS (
SELECT c1,c2 'pk3' 
FROM Table_1 
WHERE c1 = 'pk3' 
UNION 
SELECT c1,c3 'pk3' 
FROM Table_1 
WHERE c1 = 'pk3' 
UNION 
SELECT c1,c4 'pk3' 
FROM Table_1 
WHERE c1 = 'pk3' 
UNION 
SELECT c1,c5 'pk3' 
FROM Table_1 
WHERE c1 = 'pk3'), 
pk3_rn AS 
(SELECT ROW_NUMBER() OVER(PARTITION BY c1 ORDER BY pk3 ASC) AS Row#, pk3 
FROM pk3) 

SELECT pk1_rn.pk1,pk2_rn.pk2,pk3_rn.pk3 
FROM pk1_rn 
JOIN pk2_rn ON pk1_rn.Row# = pk2_rn.Row# 
JOIN pk3_rn ON pk1_rn.Row# = pk3_rn.Row#