2017-04-20 5 views
0

値と私はピボットテーブル非枢機卿は

Test Reader Result 
1  John  1.6 
1  Jack  5.2 
2  Ursula 2.5 
3  Albert 3.0 
2  Jack  5.1 

のように見えるテーブルを持っていると私は、各テストはので、私は

Test Reader_1 Result_1 Reader_2 Result_2 Reader_3 Result_3 
1  John  1.6  Jack  5.2  (null) (null) 
2  Ursula 2.5  Jack  5.1  (null) (null) 
3  Albert 3.0  (null) (null) (null) (null) 
のように見えるテーブルを作成したい3 Readersの最大を持つことができます知っています

私は周りを見回し、私はPIVOTテーブルを使用する必要があるようです。唯一の問題は、序数変数を使用して列を作成する例が見つかりました。このケースでは、私は可能な列(3)の事前定義された数を持っています。何か案は?

+0

あなたは(ピボットを使用せずに)私はちょうどここに答えたものを見ることができます:http://stackoverflow.com/questions/43511952/sql-server-2008-display-ピリオドなしの行アイテム -/43512523#43512523 – etsa

答えて

2

必要としないソリューション複数のセルフジョイン:

あなたご所望の出力を得るためにROW_NUMBER()解析関数の結果にPIVOTことができます:

SELECT * 
FROM (
    SELECT t.*, 
     ROW_NUMBER() OVER (PARTITION BY test ORDER BY ROWNUM) AS rn 
    FROM your_table t 
) 
PIVOT (MAX(Reader) AS reader, MAX(result) AS result FOR rn IN (1, 2, 3)); 

出力

TEST 1_READER 1_RESULT 2_READER 2_RESULT 3_READER 3_RESULT 
---- -------- -------- -------- -------- -------- -------- 
    1 John   1.6 Jack   5.2 
    2 Ursula  2.5 Jack   5.1 
    3 Albert  3.0 

それとも、単に集計関数を使用して:

SELECT test, 
     MAX(CASE rn WHEN 1 THEN reader END) AS reader_1, 
     MAX(CASE rn WHEN 1 THEN result END) AS result_1, 
     MAX(CASE rn WHEN 2 THEN reader END) AS reader_2, 
     MAX(CASE rn WHEN 2 THEN result END) AS result_2, 
     MAX(CASE rn WHEN 3 THEN reader END) AS reader_3, 
     MAX(CASE rn WHEN 3 THEN result END) AS result_3 
FROM (
    SELECT t.*, 
     ROW_NUMBER() OVER (PARTITION BY test ORDER BY ROWNUM) AS rn 
    FROM your_table t 
) 
GROUP BY test; 
0

上記のコメントを参照してください。私はあなたのテーブル(T1)用に変換してみました:

WITH TX AS (SELECT TEST, READER, RESULT, ROW_NUMBER() OVER (PARTITION BY TEST ORDER BY READER) AS RN 
      FROM T1 
      ) 
SELECT T0.TEST 
    , TT1.READER AS READER_1 
    , TT1.RESULT AS RESULT_1 
    , TT2.READER AS READER_2 
    , TT2.RESULT AS RESULT_2 
    , TT3.READER AS READER_3 
    , TT3.RESULT AS RESULT_3 
FROM (SELECT DISTINCT TEST FROM T1) AS T0 
LEFT JOIN TX TT1 ON T0.TEST = TT1.TEST AND TT1.RN=1 
LEFT JOIN TX TT2 ON T0.TEST = TT2.TEST AND TT2.RN=2 
LEFT JOIN TX TT3 ON T0.TEST = TT3.TEST AND TT3.RN=3; 
関連する問題