Pivot table with non-cardinal values

前端 未结 2 944
难免孤独
难免孤独 2020-12-12 07:47

I have a table that looks like

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


        
相关标签:
2条回答
  • 2020-12-12 08:17

    See my comment above. I tried to convert for your table (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;
    
    0 讨论(0)
  • 2020-12-12 08:18

    A solution that does not require multiple self-joins:

    You can PIVOT on the result of the ROW_NUMBER() analytic function to get your desired output:

    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 ) );
    

    Output:

    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
    

    Or, just using aggregation functions:

    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 讨论(0)
提交回复
热议问题