wmsys.wm_concat功能来行转列
create table idtable (id number,name varchar2(30));
insert into idtable values(10,'bc');
insert into idtable values(10,'cd');
insert into idtable values(20,'hi');
insert into idtable values(20,'ij');
insert into idtable values(20,'mn');
insert into idtable values(30,'ZA');
insert into idtable values(30,'ZB');
insert into idtable values(30,'ZC');
select * from idtable
--按同一个ID,把行内容转换为列内容
select id,wmsys.wm_concat(name) name from idtable group by id;
--每行ID都把相同ID的行内容转换为列,然后根据ID的排序进行内容叠加.
select id,wmsys.wm_concat(name) over (order by id) name from idtable
--按照ID,name进行排名,每一行内容都汇总前一行的内容(内容叠加)
select id,wmsys.wm_concat(name) over (order by id,name) name from idtable;
--每行ID都把条件相同ID的行内容转换为列内容
select id,wmsys.wm_concat(name) over (partition by id) name from idtable;
利用正则表达式实现字段拆分(列转行)
一、数据准备
SQL> drop table temp;
SQL> create table temp (col1 varchar2(3), col2 varchar2(200));
SQL> insert into temp values('A','a,aa,aaa');
SQL> insert into temp values('B','b,bb,bbb');
SQL> select * from temp;
COL1 COL2
------- -----------------
A a,aa,aaa
B b,bb,bbb
二、实现目的
COL1 COL2
------- -----------------
A a
A aa
A aaa
B b
B bb
B bbb
三、实现方法
Select col1, Regexp_Substr(col2, '[^,]+', 1, n) col2
From temp, (Select Rownum n From dual Connect By Rownum < 100)
Where n <= length(Regexp_Replace(col2, '[^,]', Null)) + 1
Order By 1, 2
SQL> drop table temp;
SQL> create table temp (col1 varchar2(3), col2 varchar2(200));
SQL> insert into temp values('A','a,aa,aaa');
SQL> insert into temp values('B','b,bb,bbb');
SQL> select * from temp;
COL1 COL2
------- -----------------
A a,aa,aaa
B b,bb,bbb
二、实现目的
COL1 COL2
------- -----------------
A a
A aa
A aaa
B b
B bb
B bbb
三、实现方法
Select col1, Regexp_Substr(col2, '[^,]+', 1, n) col2
From temp, (Select Rownum n From dual Connect By Rownum < 100)
Where n <= length(Regexp_Replace(col2, '[^,]', Null)) + 1
Order By 1, 2