sql进行分组并将两列连接到一个文本字段中

时间:2015-05-28 12:39:16

标签: sql oracle

我遇到了一些sql,需要一些帮助......

我有以下源表:

Col1    Col2    Col3
1       A       B
1       B       C
1       C       D
2       D       C
2       A       D
3       E       A
3       F       D

我的预期结果如下:

Col1    Txt
1       A;B;C;D
2       A;C;D
3       A;D;E;F

所以group by Col1,然后找到Col2Col3的所有不同值,对它们进行排序并将它们连成一个字段。

有任何想法/建议吗?

3 个答案:

答案 0 :(得分:1)

如果您使用的是oracle 11.2或更新版本,则可以使用listagg

select 
  y, 
  listagg(x,';') WITHIN GROUP (ORDER BY x)
from  
    (select col1 y, col2 x from test_table
union 
select col1 y, col3 x from test_table)
group by
  y

如果您使用的是早期版本,则可以使用此版本(取自oracle-l邮件列表的旧帖子)

select y, max(sys_connect_by_path(x, ' | ')) trans
from (
select y, x, row_number() over (partition by y order by x) cur, row_number() over (partition by y order by x) - 1 prev 
from (select col1 y, col2 x from test_table
union 
select col1 y, col3 x from test_table)
)
connect by prior cur = prev and prior y = y
start with cur = 1
group by y

这是一个测试它们的示例脚本

create table test_table (col1 numeric, col2 varchar2(2), col3 varchar2(2));
insert into test_table values (1,'A','B'); 
insert into test_table values (1,'B','C');
insert into test_table values (1,'C','D');
insert into test_table values (2,'D','C');
insert into test_table values (2,'A','D');
insert into test_table values (3,'E','A');
insert into test_table values (3,'F','D');

答案 1 :(得分:0)

您可以UNIONcol2col3,然后使用LISTAGG

SELECT Col1,LISTAGG(Col2,';') WITHIN GROUP (ORDER BY Col2)
(
SELECT DISTINCT Col1,Col2
FROM YourTable
UNION 
SELECT DISTINCT Col1,Col3
FROM YourTable
)
GROUP BY Col1

答案 2 :(得分:0)

这样的东西
select 
  col1, 
  listagg(col23)
from
  (select distinct col1, col23 from
    (select col1, col2 col23 from table 
     union all
     select col1, col3 from table))
group by
  col1