在Oracle中将多行组合成一行?

时间:2013-06-17 12:45:23

标签: sql oracle oracle11g

我的测试表中有3列,如

ID | m_id    | S_m_id                                 
---------- --------------
1  |  1      |    1                  
1  |  2      |    3                  
1  |  3      |    4                  
1  |  5      |    6                  
2  |  1      |    1                  
2  |  2      |    3                  
2  |  3      |    4                  
3  |  5      |    6

我想基于第1列将第2列和第3列合并为一行。结果应该像

ID | merge_id                                 
---------- --------------
1  |  1,1;2,3;3,4;5,6                  
2  |  1,1;2,3;3,4                  
3  |  5,6       

1 个答案:

答案 0 :(得分:4)

聚合时,您需要的函数是listagg(),并且字符串连接。您还需要首先将ID连接在一起:

select id,
       listagg(m_id || ',' || s_m_id, ';') within group (order by m_id) as merge_ids
from test t
group by id;

顺便说一句,结果数据不正确(因为所有三行的id都相同)。这可能是downvote的原因。

编辑(回应评论):

原始示例中有两个分隔符,一个是逗号(在ID之间),另一个是分号(在行之间)。您可以使用'|'替换以获取管道分隔符。