【问题标题】:Concatenate and group multiple rows in Oracle [duplicate]在Oracle中连接和分组多行[重复]
【发布时间】:2012-09-15 12:40:04
【问题描述】:

可能重复:
how to retrieve two columns data in A,B format in Oracle

假设我有这样一张桌子:

NAME          GROUP_NAME
name1         groupA
name2         groupB
name5         groupC
name4         groupA
name3         groupC

我想要这样的结果:

GROUP_NAME     NAMES
groupA         name1,name4
groupB         name2
groupC         name3,name5

如果表中只有一列,我可以通过执行以下操作来连接记录,但是在上下文中进行分组,我真的没有太多想法。

连接一个列表:

SELECT names 
FROM (SELECT SYS_CONNECT_BY_PATH(names,' ') names, level
      FROM name_table

      START WITH names = (SELECT names FROM name_table WHERE rownum = 1)
      CONNECT BY PRIOR names < names
      ORDER BY level DESC)
      WHERE rownum = 1 

更新:

我现在有了使用LISTAGG的解决方案:

SELECT
group_name,
LISTAGG(name, ', ')
WITHIN GROUP (ORDER BY GROUP) "names"
FROM name_table
GROUP BY group_name

LISTAGG 不可用时,仍然对更“通用”的解决方案感兴趣。

【问题讨论】:

标签: sql oracle concatenation grouping group-concat


【解决方案1】:

如果您使用的是 11g,请考虑使用 LISTAGG 函数:

select grp, listagg(name,',') within group( order by name ) 
  from name_table group by grp

sqlFiddle

更新:如果不是,请考虑使用分析:

select grp,
    ltrim(max(sys_connect_by_path
       (name, ',' )), ',')
        scbp
  from (select name, grp,
            row_number() over
           (partition by grp
            order by name) rn
         from tab
          )
start with rn = 1
connect by prior rn = rn-1
and prior grp = grp
  group by grp
  order by grp

sqlFiddle

【讨论】:

  • 谢谢先生!我根本不知道 LISTAGG。快速尝试一下,它给了我想要的东西!
猜你喜欢
  • 2017-01-19
  • 2020-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-29
  • 1970-01-01
相关资源
最近更新 更多