【问题标题】:combine multiple rows into a single row in Oracle? [duplicate]在Oracle中将多行合并为一行? [复制]
【发布时间】:2013-06-17 12:45:22
【问题描述】:

我的测试表中有 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       

【问题讨论】:

  • 这被称为字符串聚合——搜索 SO 寻找很多例子

标签: sql oracle oracle11g


【解决方案1】:

您需要的函数是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 都相同)。这可能是反对票的原因。

编辑(回应评论):

在原始示例中有两个分隔符,一个是逗号(在 id 之间),一个是分号(在行之间)。您可以用'|' 替换任何一个来获得管道分隔符。

【讨论】:

  • 嗨,戈登,谢谢...它有效...但是我如何将 id 列与分隔符 | 合并。
  • 现在想将第 1 列和第 2 列与管道分隔符合并
  • select id,test.nextval listagg(m_id || ',' || s_m_id, ';') 组内(按 m_id 排序)作为来自 test t 组的merge_ids by id;使用此查询,我得到了 ora - 02287 序列号,此处不允许。
猜你喜欢
  • 2011-12-14
  • 2019-09-25
  • 1970-01-01
  • 1970-01-01
  • 2020-04-17
  • 2010-11-10
  • 1970-01-01
  • 1970-01-01
  • 2022-10-16
相关资源
最近更新 更多