首页 > 解决方案 > Oracle如何将多行转置为聚合列

问题描述

我有桌子

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

而且我正在尝试将其转置以将每个不同的 ID 放在不同的列中,并按表名和用逗号分隔的列名对其进行分组。

我需要像这样的输出:

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 个不同的 id。我尝试使用 PIVOT 功能。我也尝试了一个 LISTAGG 函数,但我无法得到我想要的结果。

标签: sqloracleplsqlpivot

解决方案


您可以使用条件聚合:

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 上的演示

所有者 | 表名 | 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 | 姓            
用户 | CC_CASES | X_OIB,X_OIB_2 | X_JMBG,X_JMBG_2 | FIRST_NAME,FIRST_NAME_2 | LAST_NAME,LAST_NAME_2

推荐阅读