Oracle如何将多行转置为聚合列
Posted
技术标签:
【中文标题】Oracle如何将多行转置为聚合列【英文标题】:Oracle how to transpose multiple rows into aggregate column 【发布时间】:2020-02-16 22:28:38 【问题描述】:我有桌子
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 函数,但我无法得到我想要的结果。
【问题讨论】:
【参考方案1】:您可以使用条件聚合:
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
Demo on 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【讨论】:
以上是关于Oracle如何将多行转置为聚合列的主要内容,如果未能解决你的问题,请参考以下文章