Concatenate and group multiple rows in Oracle(在 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 中连接和分组多行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:在 Oracle 中连接和分组多行


基础教程推荐
- Sql Server 字符串到日期的转换 2021-01-01
- SQL Server:只有 GROUP BY 中的最后一个条目 2021-01-01
- 无法在 ubuntu 中启动 mysql 服务器 2021-01-01
- ERROR 2006 (HY000): MySQL 服务器已经消失 2021-01-01
- 如何在 SQL Server 的嵌套过程中处理事务? 2021-01-01
- 使用pyodbc“不安全"的Python多处理和数据库访问? 2022-01-01
- SQL Server 2016更改对象所有者 2022-01-01
- 在 VB.NET 中更新 SQL Server DateTime 列 2021-01-01
- 将数据从 MS SQL 迁移到 PostgreSQL? 2022-01-01
- SQL Server 中单行 MERGE/upsert 的语法 2021-01-01