wmsys.wm_concat、sys_connect_by_path、自定义函数实现行列转换

无论是在做Oracle数据库开发还是在运维的过程中,我们经常都会使用到行列转换操作,Oracle为行列转换提供了一些内置函数,下面我们对比一下使用这些函数如何实现行列转换。
1、创建测试需要使用的表
SQL> CREATE TABLE tangyun(PID NUMBER NOT NULL PRIMARY KEY,cName VARCHAR2(20));

表已创建。

SQL> CREATE TABLE tangyun_sub(SID NUMBER NOT NULL,pName VARCHAR2(20));

表已创建。
2、在测试表中插入一些数据
SQL> INSERT INTO tangyun VALUES (1,'电子政务');
已创建 1 行。
SQL> INSERT INTO tangyun VALUES (2,'IT工程部');
已创建 1 行。
SQL> INSERT INTO tangyun VALUES (3,'市场部');
已创建 1 行。
SQL> INSERT INTO tangyun VALUES (4,'大社保部');
已创建 1 行。
SQL> COMMIT;
提交完成。
SQL> INSERT INTO tangyun_sub VALUES (1,'执法办案组');
已创建 1 行。
SQL> INSERT INTO tangyun_sub VALUES (1,'管理防范组');
已创建 1 行。
SQL> INSERT INTO tangyun_sub VALUES (1,'维护组');
已创建 1 行。
SQL> INSERT INTO tangyun_sub VALUES (1,'应用组');
已创建 1 行。
SQL> INSERT INTO tangyun_sub VALUES (1,'数据组');
已创建 1 行。
SQL> INSERT INTO tangyun_sub VALUES (2,'售后服务');
已创建 1 行。
SQL> INSERT INTO tangyun_sub VALUES (2,'产品服务');
已创建 1 行。
SQL> INSERT INTO tangyun_sub VALUES (2,'技术支持');
已创建 1 行。
SQL> INSERT INTO tangyun_sub VALUES (3,'客户服务部');
已创建 1 行。
SQL> INSERT INTO tangyun_sub VALUES (3,'产品中心');
已创建 1 行。
SQL> INSERT INTO tangyun_sub VALUES (3,'销售部');
已创建 1 行。
SQL> INSERT INTO tangyun_sub VALUES (4,'应用组');
已创建 1 行。
SQL> INSERT INTO tangyun_sub VALUES (4,'维护组');
已创建 1 行。
SQL> INSERT INTO tangyun_sub VALUES (4,'数据组');
已创建 1 行。
SQL> COMMIT;
提交完成。

3、下面对比两个函数实现行列转换

a、使用wmsys.wm_concat()函数实现行列转换
SQL> SELECT t1.PID "pid",t1.cName "cname",wmsys.wm_concat(t2.pName) "sub_name" FROM tangyun t1,tangy
un_sub t2 WHERE t1.PID=t2.SID GROUP BY t1.cName,t1.Pid order by pid;

pid cname sub_name
---------- ---------- --------------------------------------------------
1 电子政务 执法办案组,管理防范组,维护组,数据组,应用组
2 IT工程部 售后服务,产品服务,技术支持
3 市场部 客户服务部,销售部,产品中心
4 大社保部 应用组,维护组,数据组

b、使用sys_connect_by_path函数实现行列转换
SQL> select pid, cName, ltrim(max(sys_connect_by_path(pName, ',')), ',') "sub_name" from (select row
_number() over(PARTITION by t1.pid ORDER by cName) r,t1.*, t2.pName from tangyun t1, tangyun_sub t2
where t1.pid = t2.sid)
2 start with r=1 CONNECT by prior r =r-1 and prior pid = pid group by pid ,cName order by pid;

PID CNAME sub_name
---------- ---------- --------------------------------------------------
1 电子政务 执法办案组,管理防范组,维护组,应用组,数据组
2 IT工程部 售后服务,产品服务,技术支持
3 市场部 客户服务部,产品中心,销售部
4 大社保部 应用组,维护组,数据组
c、使用自定义函数实现行列转换
由于使用自定义函数实现起来比较简单,这里就不举例子了,这里只是为了复习一下wmsys.wm_concat、sys_connect_by_path两个函数的用法。

--------------End--------------------------

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24930246/viewspace-1041637/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/24930246/viewspace-1041637/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值