2016-07-17 5 views
0

私は、次の作業のクエリを持っている:Oracleのピボット列

WITH pivot_data AS (
      select PSGROUP, 
    PSCOLUMN as PSCOLUMN 
FROM LOG_PS_STATUS 
      ) 
    SELECT * 
    FROM pivot_data 
    PIVOT (
      MAX(NULL)  --<-- pivot_clause 
      FOR PSCOLUMN--<-- pivot_for_clause   
     IN (&PS_COLUMNS.) --<-- pivot_in_clause   

); 

予想通りそれは結果を示しています

値:

PSGroup PSColumn 
A   1 
A   2 
A   3 
B   1 
B   2 
B   3 
C   3 

結果のような与えている:

PSGroup(縦方向)PSColoumn(横方向)

  1 2 3 
A 
B 
C 

今私はPSColumnのグループとしてPSGroup列を作りたいと、出力は次のようにする必要があります:あなたはLISTAGGを使用することができます

A 
1 2 3 
B 
1 2 3 
C 
3 

答えて

1

WITH pivot_data(PSGroup,PSColumn) AS (
    select 'A',   1 FROM dual UNION all 
    select 'A',   2 FROM dual UNION all 
    select 'A',   3 FROM dual UNION all 
    select 'B',   1 FROM dual UNION all 
    select 'B',   2 FROM dual UNION all 
    select 'B',   3 FROM dual UNION all 
    select 'C',   3 FROM DUAL), 

    res(PSGroup,PSColumns) as(
    SELECT PSGroup, LISTAGG(PSColumn, ' ') WITHIN GROUP (order by PSColumn) 
     FROM pivot_data 
     GROUP BY PSGroup) 

    select DECODE(PSColumns,NULL,PSGroup,NULL) AS PSGroup, PSColumns from(
    select PSGroup, NULL as PSColumns from res 
     union all 
    select PSGroup, PSColumns from res)t 
     ORDER BY t.PSGroup, t.PSColumns NULLS first 

LISTAGG(PSColumn, ' ') WITHIN GROUP (order by PSColumn)があることに注意してください4000文字以内

+0

クエリを説明してください –

+0

@Muhammad Muazzamサブクエリ 'res'で私はPSGroupによってグループ化され、次にすべてのグループで、PSColumnの昇順のスペース順で区切ってPSColumn値を連結します。今私はこのような3つのレコードを持っています 'A 1 2 3'最後のクエリでは、すべての行を2に分割します。最初は列PSGroup、2番目の連結されたPSColumnのみを持ちます。 –