Oracle как переместить несколько строк в столбец агрегирования - PullRequest
0 голосов
/ 17 февраля 2020

У меня есть таблица

OWNER       TABLE_NAME      COLUMN_NAME     ATTRIBUTE_ID
-------     -------         -------         -------
USER        CC_CASES        X_OIB           0
USER        CC_CASES        X_OIB_2         0
USER        CC_CASES        X_JMBG          1
USER        CC_CASES        X_JMBG_2        1
USER        CC_CASES        FIRST_NAME      2
USER        CC_CASES        FIRST_NAME_2    2
USER        CC_CASES        LAST_NAME       3
USER        CC_CASES        LAST_NAME_2     3
SUBSCRIBER  CC_CONTACT      X_OIB           0
SUBSCRIBER  CC_CONTACT      X_MB_OIB        0
SUBSCRIBER  CC_CONTACT      X_JMBG          1
SUBSCRIBER  CC_CONTACT      X_X_JMBG_2      1
SUBSCRIBER  CC_CONTACT      FIRST_NAME      2
SUBSCRIBER  CC_CONTACT      LAST_NAME       3

И я пытаюсь транспонировать ее, чтобы поместить каждый отдельный идентификатор в разные столбцы и сгруппировать его по имени таблицы и имени столбца, разделенных запятой.

Мне нужен вывод, как:

OWNER       TABLE_NAME      OIB_COL         JMBG_COL            FIRST_NAME_COL              LAST_NAME_COL
-------     -------         -------         -------             -------                     -------
USER        CC_CASES        X_OIB,X_OIB_2   X_JMBG,X_JMBG_2     FIRST_NAME,FIRST_NAME_2     LAST_NAME,LAST_NAME_2
CC_CASES    CC_CONTACT      X_OIB,X_MB_OIB  X_JMBG,X_X_JMBG_2   FIRST_NAME                  LAST_NAME

У меня есть около 8 различных идентификаторов. Я пытался сделать с функцией PIVOT. Я также пытался использовать функцию LISTAGG, но не могу получить желаемый результат.

1 Ответ

1 голос
/ 17 февраля 2020

Вы можете использовать условное агрегирование:

select 
    owner,
    table_name,
    listagg(case when attribute_id = 0 then column_name end, ',')
        within group(order by column_name) oib_col,
    listagg(case when attribute_id = 1 then column_name end, ',')
        within group(order by column_name) jmbg_col,
    listagg(case when attribute_id = 2 then column_name end, ',')
        within group(order by column_name) first_name_col,
    listagg(case when attribute_id = 3 then column_name end, ',')
        within group(order by column_name) last_name_col
from mytable
group by owner, table_name
order by owner, table_name

Демонстрация на DB Fiddle :

OWNER    | TABLE_NAME | OIB_COL        | JMBG_COL          | FIRST_NAME_COL          | LAST_NAME_COL        
:------- | :--------- | :------------- | :---------------- | :---------------------- | :--------------------
CC_CASES | CC_CONTACT | X_MB_OIB,X_OIB | X_JMBG,X_X_JMBG_2 | FIRST_NAME              | LAST_NAME            
USER     | CC_CASES   | X_OIB,X_OIB_2  | X_JMBG,X_JMBG_2   | FIRST_NAME,FIRST_NAME_2 | LAST_NAME,LAST_NAME_2
...