Oracle преобразует строки в динамические столбцы на основе одного столбца - PullRequest
2 голосов
/ 07 октября 2019

Что у меня есть

Таблица Oracle с данными ниже

COL1  COL2
----  ----
1001  110
1001  111
1001  112
2001  210
2001  211

То, что я хочу, это

1001  110  111  112
2001  210  210

По сути, я хочу, чтобы все значения в COL2 совпадали с COL1 в одной строке.

Как мне добиться этого в Oracle? Обратите внимание, что количество столбцов должно увеличиваться в зависимости от доступных совпадающих строк. Если это невозможно, мы можем рассмотреть не более 5 значений.

1 Ответ

1 голос
/ 07 октября 2019

Самый простой способ - поместить их в один столбец, используя list_agg():

select col1, listagg(col2, ' ') within group (order by col2) as col2s
from t
group by col1;

. Для отдельных столбцов я бы рекомендовал row_number() и условное агрегирование:

select col1,
       max(case when seqnum = 1 then col2 end) as col2_1,
       max(case when seqnum = 2 then col2 end) as col2_2,
       max(case when seqnum = 3 then col2 end) as col2_3
from (select t.*, row_number() over (partition by col1 order by col2) as seqnum
      from t
     ) t
group by col1;
...