这个问题已经在这里有了答案:
已关闭8年。
假设我有一个这样的表:
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
不可用的情况,仍对更通用的解决方案感兴趣。 最佳答案
如果您使用的是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