2016-07-17 3 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 

Теперь я хочу сделать столбец PSGroup в группе PSColumn и выход должен быть как:

A 
1 2 3 
B 
1 2 3 
C 
3 

ответ

1

Вы можете использовать listagg:

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

@ Мухаммад Муацзам в подзапросе 'res' I 'group от PSGroup', затем в каждой группе concatenete значение PSColumn в нем, ограничивая пространственным порядком по PSColumn по возрастанию. Теперь у меня есть 3 записи вроде этого: « 1 2 3» Затем в последнем запросе я делю каждую строку на 2: сначала есть только столбец PSGroup, второй - concateneted PSColumn. –

Смежные вопросы