sql - 在 Oracle 中连接和分组多行

标签 sql oracle concatenation grouping group-concat

这个问题在这里已经有了答案:




8年前关闭。




Possible Duplicate:
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 的情况,仍然对更“通用”的解决方案感兴趣不可用。

最佳答案

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

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

关于sql - 在 Oracle 中连接和分组多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12558509/

相关文章:

sql - 根据星期几生成两个日期之间的每周范围

MySQL - 如果满足条件,则将一个或多个文本添加到行中

sql - mysql 显示 group by 语句的空值

匈牙利语字符的 MySQL 错误 ORDER BY

javascript - 我的接收器如何输入消息并显示在我的浏览器上

Oracle 分析日期范围

javascript - 如何从 JavaScript 表达式调用进程 - Oracle Apex v21.1

java - Eclipse JAVA程序中找不到Oracle数据库驱动程序

c++ - 连接 LPWSTR 字符串

c# - 使用选择多个 C# 进行分组和求和?