有以下数据

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版本可以用LISTAGG函数,据说可以解决上面的报错问题,这个有待以后测试

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

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

create or replace TYPE zh_concat_im
AUTHID 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_im
IS
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 ;
/

oracle的wm_concat函数实现行转列的更多相关文章

  1. Oracle 11g Pivot函数实现行转列

    先上语法规范: SELECT .... FROM <table-expr> PIVOT ( aggregate-function(<column>) FOR <pivot ...

  2. [转]Oracle SQL函数pivot、unpivot转置函数实现行转列、列转行

    原文地址:http://blog.csdn.net/seandba/article/details/72730657 函数PIVOT.UNPIVOT转置函数实现行转列.列转行,效果如下图所示: 1.P ...

  3. Oracle中wm_concat()函数的使用

    Oracle中wm_concat()函数的使用 wm_concat()函数是oracle行列转换函数,该函数可以把列值以‘,’分割开来,并显示成一行. 1.原数据: 2.把结果分组以‘|’分隔,以一行 ...

  4. Oracle创建WM_CONCAT函数

    Oracle创建WM_CONCAT函数 WM_CONCAT这个函数会出错,所以从 11g开始.官方不认可 WM_CONCAT.然后就没这个函数了, 下面就是创建WM_CONCAT这个函数的步骤 第一步 ...

  5. 重写Oracle的wm_concat函数,自定义分隔符、排序

    oracle中,wm_concat函数是一个聚合函数,和mysql中的group_concat函数类似,不过group_concat函数比较强大,可以定义分隔符和排序,当然所谓强大是相对的,这里假使我 ...

  6. Oracle的wm_concat函数(转)

    wm_concat函数简单说就是行转列显示. 转自:http://christy-fang.iteye.com/blog/1299850 首先让我们来看看这个神奇的函数wm_concat(列名),该函 ...

  7. oracle 的wm_concat函数使用

    转载自:http://blog.itpub.net/post/42245/522757 首先让我们来看看这个神奇的函数wm_concat(列名),该函数可以把列值以","号分隔起来 ...

  8. oracle的神奇化学反应(行转列+获取表字段)

    橘子+汽水=橘子汽水,∑(゚Д゚ノ)ノ好无聊!!! 火鸡+烤架=烤火鸡,ლ(´ڡ`ლ)还不错. wm_concat()+表字段查询=(✪ω✪)会是啥呢? wm_concat()函数,该函数可以把列值以 ...

  9. PIVOT内置函数实现行转列

    PIVOT用于将列值旋转为列名(即行转列),PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P 完整语法: table_source PIVOT( 聚合函数(va ...

随机推荐

  1. Java生成随机图片验证码

    前台html代码 [Java] 纯文本查看 复制代码 ? 01 02 03 04 05 06 07 08 09 10 <div style="margin-top: 50px;&quo ...

  2. 安装rpm包时遇到error: Failed dependencies:错误

    在linux下安装rpm包时经常会遇到下面这个问题: error: Failed dependencies: ............................................. ...

  3. vue面试总结

    https://www.kancloud.cn/hanxuming/vue-iq/728305 https://segmentfault.com/a/1190000016351284 https:// ...

  4. php 依赖注入 和 控制反转 php设计模式

    https://blog.csdn.net/zyddj123/article/details/82753650 什么是依赖注入?IOC:英文全称:Inversion of Control,中文名称:控 ...

  5. java操作telnet远程登录

    import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import jav ...

  6. unittest(22)- p2p项目实战(2)-http_request

    # 2. http_request.py import requests from learn_logging_5.write_log_class import MyLog my_logger = M ...

  7. Spring MVC 增加静态资源配置mvc:resources跳转不了链接

    在使用mvc:resources 要配合 <mvc:annotation-driven/> 一起

  8. win+E 出现“未指定错误“修复方案

    windows7 (win7) win+E 出现"未指定错误----"解决方法 出现该问题的原因:大家使用某种注册表优化所致,如使用优化大师等优化注册表-- 解决方法: 1.如果优 ...

  9. 从一道网易面试题浅谈 Tagged Pointer - darcy_tang 的博客

    前言 这篇博客九月就想写了,因为赶项目拖了到现在,抓住17年尾巴写吧~ 正文 上次看了一篇 <从一道网易面试题浅谈OC线程安全> 的博客,主要内容是: 作者去网易面试,面试官出了一道面试题 ...

  10. 推荐一款在UBUNTU下使用的编辑器

    偶然的机会 ,发现了这款软件,以前一直是在用gedit编辑器,但在WINDOWS下写的文档,在ubuntu下用gedit打开后,复制有换行的问题,一直没解决,所以在网上找到了这款软件,安装使用了几天, ...