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如何将多行转置为聚合列的主要内容,如果未能解决你的问题,请参考以下文章

oracle sql 11G中如何将列转置为行

oracle如何在没有UNION的情况下将列转置为行

Oracle:将列转置为行

红移。我们如何(动态地)将表从列转置为行?

将列转置为行 SQL Server

使用交叉应用将列转置为行