我遇到了一些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
,然后找到Col2
和Col3
的所有不同值,对它们进行排序并将它们连成一个字段。
有任何想法/建议吗?
答案 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)
您可以UNION
列col2
和col3
,然后使用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