一、简介
在实际项目中进行一些统计数据时,难免会遇到需要合并数据在列表进行展示的需求。本文将讲解一下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 合并数据的两种方法,本文是作者在实际项目中遇到这样的需求进行的一些在总结和方法,仅供大家学习参考,共同学习共同进步。