【问题标题】:Oracle how to transpose multiple rows into aggregate columnOracle如何将多行转置为聚合列
【发布时间】: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 函数,但我无法得到我想要的结果。

【问题讨论】:

    标签: sql oracle plsql pivot


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-30
      • 1970-01-01
      • 2016-11-21
      • 2015-09-04
      相关资源
      最近更新 更多