在 Oracle 中连接和分组多行 [英] Concatenate and group multiple rows in Oracle

查看:27
本文介绍了在 Oracle 中连接和分组多行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

可能的重复:
如何检索 A、B 中的两列数据Oracle 格式

假设我有一张这样的表:

Suppose I have a table like this:

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

我想要这样的结果:

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

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

If there were only one column in the table, I could concatenate the records by doing the following, but with grouping in the context, I really don't have much idea.

连接一个列表:

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 不可用的情况,仍然对更通用"的解决方案感兴趣.

Still interested in a more "general" solution for cases when LISTAGG is not available.

推荐答案

考虑使用 LISTAGG 功能,以防您使用 11g:

Consider using LISTAGG function in case you're on 11g:

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

sqlFiddle

upd:如果您不是,请考虑使用分析:

upd: In case you're not, consider using analytics:

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

这篇关于在 Oracle 中连接和分组多行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆