Oracle合并数据的方法 wm_concat() 和 listagg()

一、简介

在实际项目中进行一些统计数据时,难免会遇到需要合并数据在列表进行展示的需求。本文将讲解一下oracle 11g合并数据的两种方法 (wm_concat() 和 listagg())。示例:

--with as 相当于一张临时表(一次分析,多次使用)  
with temp as
 (select 'male' as sex, 'zhangsan' as stu_name
    from dual
  union
  select 'male' as sex, 'lisi' as stu_name
    from dual
  union
  select 'female' as sex, 'xiaohong' as stu_name
    from dual
  union
  select 'female' as sex, 'xiaozhang' as stu_name
    from dual
  union
  select 'male' as sex, 'zhaoliu' as stu_name
    from dual)
    
select t.* from temp t;

在没有合并数据之前,数据查询出来可能有一些字段重复,如下图:

下面将性别相同的合并起来进行展示。

二、第一种方法: wm_concat() 

--with as 相当于一张临时表(一次分析,多次使用)  
with temp as
 (select 'male' as sex, 'zhangsan' as stu_name
    from dual
  union
  select 'male' as sex, 'lisi' as stu_name
    from dual
  union
  select 'female' as sex, 'xiaohong' as stu_name
    from dual
  union
  select 'female' as sex, 'xiaozhang' as stu_name
    from dual
  union
  select 'male' as sex, 'zhaoliu' as stu_name
    from dual)
    
--第一种方法: 使用 wm_concat()方法进行合并,默认以逗号分隔   
select t.sex as sex, wm_concat(t.stu_name) as stu_name
  from temp t
 group by t.sex;

查询结果:

如果想替换分隔的字符:

--with as 相当于一张临时表(一次分析,多次使用)  
with temp as
 (select 'male' as sex, 'zhangsan' as stu_name
    from dual
  union
  select 'male' as sex, 'lisi' as stu_name
    from dual
  union
  select 'female' as sex, 'xiaohong' as stu_name
    from dual
  union
  select 'female' as sex, 'xiaozhang' as stu_name
    from dual
  union
  select 'male' as sex, 'zhaoliu' as stu_name
    from dual)
    
--如果不想使用逗号分隔,可以替换成其他字符
select t.sex as sex, replace(wm_concat(t.stu_name), ',', '|') as stu_name
  from temp t
 group by t.sex;

查询结果:

三、第二种方法: listagg()

--with as 相当于一张临时表(一次分析,多次使用)  
with temp as
 (select 'male' as sex, 'zhangsan' as stu_name
    from dual
  union
  select 'male' as sex, 'lisi' as stu_name
    from dual
  union
  select 'female' as sex, 'xiaohong' as stu_name
    from dual
  union
  select 'female' as sex, 'xiaozhang' as stu_name
    from dual
  union
  select 'male' as sex, 'zhaoliu' as stu_name
    from dual)
    
--第二种方法: 使用listagg()方法,可以指定分隔的字符
select t.sex as sex,
       listagg(t.stu_name,',') within group(order by t.stu_name) as stu_name
  from temp t
 group by t.sex;

注意: 需要加上within group(order by ...)

查询结果:

如果想用别的分隔字符,直接指定即可:

--with as 相当于一张临时表(一次分析,多次使用)  
with temp as
 (select 'male' as sex, 'zhangsan' as stu_name
    from dual
  union
  select 'male' as sex, 'lisi' as stu_name
    from dual
  union
  select 'female' as sex, 'xiaohong' as stu_name
    from dual
  union
  select 'female' as sex, 'xiaozhang' as stu_name
    from dual
  union
  select 'male' as sex, 'zhaoliu' as stu_name
    from dual)
    
--如果需要替换分隔字符,直接指定其他字符即可
select t.sex as sex,
       listagg(t.stu_name,'|') within group(order by t.stu_name) as stu_name
  from temp t
 group by t.sex;

查询结果:

四、总结

以上是关于oracle 合并数据的两种方法,本文是作者在实际项目中遇到这样的需求进行的一些在总结和方法,仅供大家学习参考,共同学习共同进步。

猜你喜欢

转载自blog.csdn.net/Weixiaohuai/article/details/83416292