zhouzangood

---恢复内容开始---

wm_concat函数

函数可以把列值以","号分隔起来,并显示成一行。
测试数据
SQL> create table test(id number,name varchar2(20));
SQL> insert into test values(1,\'a\');
SQL> insert into test values(1,\'b\');
SQL> insert into test values(1,\'c\');
SQL> insert into test values(2,\'d\');
SQL> insert into test values(2,\'e\');
SQL> commit;
效果1 : 行转列
SQL> select wm_concat(name) from test;
WM_CONCAT(NAME)
-------------------------------------------------------------------------
a,b,c,d,e
效果2: 把结果里的逗号替换成"|"
SQL> select replace(wm_concat(name),\',\',\'|\') from test;
REPLACE(WM_CONCAT(NAME),\',\',\'|\')
-----------------------------------------------------------------------
a|b|c|d|e
效果3:按ID分组合并name
SQL> select id,wm_concat(name) name from test group by id;
ID NAME
---------- ------------------------------
1 a,b,c
2 d,e

 

 

select * from table;

        ID NAME
        1 ab
        1 bc
        1 cd
        2 hi
        2 ij
        2 mn


select id,wmsys.wm_concat(name) name from idtable group by id;

        ID NAME
        1 ab,bc,cd
        2 hi,ij,mn

select id,wmsys.wm_concat(name) over (order by id) name from idtable;

        ID NAME
        1 ab,bc,cd
        1 ab,bc,cd
        1 ab,bc,cd
        2 ab,bc,cd,hi,ij,mn
        2 ab,bc,cd,hi,ij,mn
        2 ab,bc,cd,hi,ij,mn

select id,wmsys.wm_concat(name) over (order by id,name) name from idtable;

        ID NAME
        1 ab
        1 ab,bc
        1 ab,bc,cd
        2 ab,bc,cd,hi
        2 ab,bc,cd,hi,ij
        2 ab,bc,cd,hi,ij,mn

select id,wmsys.wm_concat(name) over (partition by id) name from idtable;

        ID NAME
        1 ab,bc,cd
        1 ab,bc,cd
        1 ab,bc,cd
        2 hi,ij,mn
        2 hi,ij,mn
        2 hi,ij,mn

select id,wmsys.wm_concat(name) over (partition by id,name) name from idtable;

        ID NAME
        1 ab
        1 bc
        1 cd
        2 hi
        2 ij
        2 mn

//合并列,并取出重复 with table1 as ( select 1 as code, \'一\' as name from dual union all select 1 as code, \'一\' as name from dual union all select 2 as code, \'二\' as name from dual union all select 3 as code, \'三\' as name from dual union all select 4 as code, \'四\' as name from dual union all select 5 as code, \'五\' as name from dual ) select listagg(name_list, \',\') within group (order by code) name_list from ( select code, case when lag(name) over (order by name) = name then null else name end as name_list from table1 );

---恢复内容结束---

wm_concat函数

函数可以把列值以","号分隔起来,并显示成一行。
测试数据
SQL> create table test(id number,name varchar2(20));
SQL> insert into test values(1,\'a\');
SQL> insert into test values(1,\'b\');
SQL> insert into test values(1,\'c\');
SQL> insert into test values(2,\'d\');
SQL> insert into test values(2,\'e\');
SQL> commit;
效果1 : 行转列
SQL> select wm_concat(name) from test;
WM_CONCAT(NAME)
-------------------------------------------------------------------------
a,b,c,d,e
效果2: 把结果里的逗号替换成"|"
SQL> select replace(wm_concat(name),\',\',\'|\') from test;
REPLACE(WM_CONCAT(NAME),\',\',\'|\')
-----------------------------------------------------------------------
a|b|c|d|e
效果3:按ID分组合并name
SQL> select id,wm_concat(name) name from test group by id;
ID NAME
---------- ------------------------------
1 a,b,c
2 d,e

 

 

select * from table;

        ID NAME
        1 ab
        1 bc
        1 cd
        2 hi
        2 ij
        2 mn


select id,wmsys.wm_concat(name) name from idtable group by id;

        ID NAME
        1 ab,bc,cd
        2 hi,ij,mn

select id,wmsys.wm_concat(name) over (order by id) name from idtable;

        ID NAME
        1 ab,bc,cd
        1 ab,bc,cd
        1 ab,bc,cd
        2 ab,bc,cd,hi,ij,mn
        2 ab,bc,cd,hi,ij,mn
        2 ab,bc,cd,hi,ij,mn

select id,wmsys.wm_concat(name) over (order by id,name) name from idtable;

        ID NAME
        1 ab
        1 ab,bc
        1 ab,bc,cd
        2 ab,bc,cd,hi
        2 ab,bc,cd,hi,ij
        2 ab,bc,cd,hi,ij,mn

select id,wmsys.wm_concat(name) over (partition by id) name from idtable;

        ID NAME
        1 ab,bc,cd
        1 ab,bc,cd
        1 ab,bc,cd
        2 hi,ij,mn
        2 hi,ij,mn
        2 hi,ij,mn

select id,wmsys.wm_concat(name) over (partition by id,name) name from idtable;

        ID NAME
        1 ab
        1 bc
        1 cd
        2 hi
        2 ij
        2 mn

//合并列,并取出重复 with table1 as ( select 1 as code, \'一\' as name from dual union all select 1 as code, \'一\' as name from dual union all select 2 as code, \'二\' as name from dual union all select 3 as code, \'三\' as name from dual union all select 4 as code, \'四\' as name from dual union all select 5 as code, \'五\' as name from dual ) select listagg(name_list, \',\') within group (order by code) name_list from ( select code, case when lag(name) over (order by name) = name then null else name end as name_list from table1 );

分类:

技术点:

相关文章: