在Oracle中连接和分组多行

46

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

假设我有这样一个表:

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 函数,仍然希望了解更 "通用" 的解决方案。


你使用的Oracle版本是什么?可用的选项取决于Oracle版本。 - Justin Cave
如果你想使用一些常见的东西,你应该编写自己的聚合函数。http://docs.oracle.com/cd/B28359_01/appdev.111/b28425/aggr_functions.htm 可以提供帮助。 - Pavel Zimogorov
1个回答

92

如果您正在使用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


2
谢谢您!我之前完全不知道LISTAGG。我试了一下,它给了我想要的结果! - Yijia Zhan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接