Oracle拼接多列结果实例

427 阅读1分钟

oracle对于唯一标识一致,组合其他列的数据使用wm_concat函数可拼接

报告编码(bgbm)检查部位(jcbwmc)
00001胸部
00001腹部
00001腰部
select t.bgbm,wm_concat(jcbwmc) as bwmc from hc_jcbg t where t.bgbm ='00001' group by t.bgbm;

查询结果:

bgbmbwmc
00001胸部,腹部,腰部

使用wm_concat出现中文乱码时

针对oracle拼接函数的乱码,首先查询一下oracle字符的编码是否支持中文,查询语句:

SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER = ‘NLS_CHARACTERSET’; 

如果是中文的,则选择另一种方式:
wmsys.wm_concat(to_char(….))..应该加上to_char() 在拼接的字段加上转换就可以了.

Oracle 函数xmlagg拼接 xmlagg(xmlparse(content 合并字段||’,’ wellformed) order by 排序字段).getclobval()

oracle的 listagg() WITHIN GROUP ()函数使用

1.使用条件查询 查询部门为20的员工列表
-- 查询部门为20的员工列表
SELECT t.DEPTNO,t.ENAME FROM SCOTT.EMP t where t.DEPTNO = '20' ;

2.使用 listagg() WITHIN GROUP () 将多行合并成一行

SELECT
    T .DEPTNO,
    listagg (T .ENAME, ',') WITHIN GROUP (ORDER BY T .ENAME) names
FROM
    SCOTT.EMP T
WHERE
    T .DEPTNO = '20'
GROUP BY
    T .DEPTNO

3. 使用 listagg() within GROUP () over 将多行记录在一行显示

SELECT
    T .DEPTNO,
    listagg (T .ENAME, ',') WITHIN GROUP (ORDER BY T .ENAME)  over(PARTITION BY T .DEPTNO)
FROM
    SCOTT.EMP T
WHERE
    T .DEPTNO = '20' 
注:使用的表数据是oracle 用户scott下的emp(员工)表