博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
oracle的wm_concat函数实现行转列
阅读量:4577 次
发布时间:2019-06-08

本文共 2865 字,大约阅读时间需要 9 分钟。

有以下数据

deptname phone username isboss
部门A 电话1 员工A 0
部门A 电话1 领导A 1
部门B 电话2 员工B 0
部门B 电话2 员工C 0
部门B 电话2 领导D 1

 

需要展示效果

deptname phone boss emp
部门A 电话1 领导A 员工A
部门B 电话2 领导D 员工B,员工C

因为是oracle10g的原因,所以使用了wm_concat函数,但对wm_concat结果长度有限制,超出会报ORA-22922:不存在的LOB值,这是后话,先贴代码

Select t5.deptname,       Max(t5.tel),       dbms_lob.substr(wmsys.wm_concat(To_Char(t5.boss))) boss,       dbms_lob.substr(wmsys.wm_concat(To_Char(t5.notboss))) notboss  From (Select t1.NAME deptname,               t1.TEL tel,               Case t2.ISBOSS                 When 1 Then                  t2.TRUE_NAME               End boss,               Case t2.ISBOSS                 When 0 Then                  t2.TRUE_NAME               End notboss          From t_duty t          Left Join t_department t1            On t.DEP_ID = t1.DEP_ID          Left Join t_contacts t2            On t.CONTACTS_ID = t2.CONTACTS_ID         Where t.DUTY_TIME = Trunc(SysDate) ) t5 Group By t5.deptname

同样的情况的如果是oracle11gR2版本可以用,据说可以解决上面的报错问题,这个有待以后测试

但是我现在的是10g的,而且会报上面的错误,网上的一些解决方案都没解决,有人写了自定义函数,亲测完美解决

原出处已经找不到了,就不贴链接了,但还是非常感谢解决了这个问题

create or replace TYPE zh_concat_imAUTHID CURRENT_USER AS OBJECT(  CURR_STR VARCHAR2(32767),  STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT zh_concat_im) RETURN NUMBER,  MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT zh_concat_im,               P1 IN VARCHAR2) RETURN NUMBER,  MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN zh_concat_im,                                 RETURNVALUE OUT VARCHAR2,                                 FLAGS IN NUMBER)                     RETURN NUMBER,  MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT zh_concat_im,                    SCTX2 IN  zh_concat_im) RETURN NUMBER);/create or replace TYPE BODY zh_concat_imIS  STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT zh_concat_im)  RETURN NUMBER  IS  BEGIN    SCTX := zh_concat_im(NULL) ;    RETURN ODCICONST.SUCCESS;  END;  MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT zh_concat_im,          P1 IN VARCHAR2)  RETURN NUMBER  IS  BEGIN    IF(CURR_STR IS NOT NULL) THEN      CURR_STR := CURR_STR || ':' || P1;    ELSE      CURR_STR := P1;    END IF;    RETURN ODCICONST.SUCCESS;  END;  MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN zh_concat_im,                                 RETURNVALUE OUT VARCHAR2,                                 FLAGS IN NUMBER)    RETURN NUMBER  IS  BEGIN    RETURNVALUE := CURR_STR ;    RETURN ODCICONST.SUCCESS;  END;  MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT zh_concat_im,                                   SCTX2 IN zh_concat_im)  RETURN NUMBER  IS  BEGIN    IF(SCTX2.CURR_STR IS NOT NULL) THEN      SELF.CURR_STR := SELF.CURR_STR || ':' || SCTX2.CURR_STR ;    END IF;    RETURN ODCICONST.SUCCESS;  END;END;/create or replace FUNCTION zh_concat(P1 VARCHAR2)RETURN VARCHAR2 AGGREGATE USING zh_concat_im ;/

 

转载于:https://www.cnblogs.com/madlife/p/7436106.html

你可能感兴趣的文章
有关指针和数组的理解
查看>>
Module模式
查看>>
《javascript高级程序设计》读书笔记(一)javascript简单介绍
查看>>
NOI2010 超级钢琴
查看>>
第一次冲刺最后一次报告
查看>>
netfilter/iptables全攻略
查看>>
laravel5.5 认证JWT使用
查看>>
wpf Smith.WPF.HtmlEditor 使用方法
查看>>
PDO分页
查看>>
2018-2019-2 网络对抗技术 20165333 Exp7 网络欺诈防范
查看>>
【Python—windows 下 virtualEnv 使用】
查看>>
【Luogu】P3177树上染色(树形DP)
查看>>
【Luogu】P3228数列(数学题)
查看>>
Asp.Net操作WebServices
查看>>
Linux基础命令----smbclient
查看>>
测试用例设计方法及增加新字段测试方法
查看>>
hrbust 1491 网络流一般增广路
查看>>
软件-开发工具:Gradle
查看>>
2019.7.4 打卡第五天
查看>>
day06数据类型----元组、字典、集合
查看>>