oracle 11g的 listagg() WITHIN GROUP () 行转列函数

奇葩需求:单个病人未支付列表查询接口 一个医生开的处方单显示一条数据 处方单用逗号合并,金额累计。
用处:第三方公司合并支付。

1.使用条件查询 查询病人id为407990的未支付列表
oracle 11g的 listagg() WITHIN GROUP () 行转列函数_第1张图片

2.使用 listagg() WITHIN GROUP () 将多行合并成一行 金额合并
oracle 11g的 listagg() WITHIN GROUP () 行转列函数_第2张图片

这里有个问题 就是单号有重复项,然后金额是没问题的
解决方案:
Oracle listagg() within group()函数 多行转一行去除重复数据

regexp_replace(listagg(a, ',') within group(order by a),'([^,]+)(,\1)+','\1') as a

解决效果图:
oracle 11g的 listagg() WITHIN GROUP () 行转列函数_第3张图片
最终需要的参数效果图:
oracle 11g的 listagg() WITHIN GROUP () 行转列函数_第4张图片

注意版本问题:
查看oracle版本select * from v$version;
在oracle10g中wn_concat()函数是可以正常使用的,但是它没有向上兼容
wn_concat():
简单的语法是 select wn_concat(字段A) from 表名 group by 字段B。
我们将表中的数据安装字段B分组,把相同B数据的A字段用逗号分隔拼在一起。

10g我没测,11g建议用我上面说的方法,可行。

未去重复项源码:

SELECT Zl_Get_人员id(a.开单人) As dr_id, Sum(A.应收金额) * 100 As payAmout,
       listagg(a.no, ',') WITHIN GROUP(ORDER BY a.no)  As prescriptionIds
  from 门诊费用记录 A,
       部门表       B,
       收费项目目录 C,
       病人医嘱记录 D,
       部门表       E,
       人员表       F
 where A.记录状态 = 0
   And 记录性质 = 1
   AND A.医嘱序号 = D.ID(+)
   and A.开单部门ID = B.ID
   And A.执行部门ID = E.Id
   And A.收费细目ID = C.ID
   and a.登记时间 >= sysdate - 1
   and A.开单部门ID = B.Id
   and A.开单人 = f.姓名
   and A.结帐ID Is Null
   and a.病人id = 407990
 GROUP BY Zl_Get_人员id(a.开单人)
 order by  listagg(a.no, ',') WITHIN GROUP(ORDER BY a.no) desc

去重复项源码:

SELECT Zl_Get_人员id(a.开单人) As dr_id, Sum(A.应收金额) * 100 As payAmout,
  max(To_Char(A.登记时间, 'yyyy-MM-dd')) As clinicTime,
       max(B.名称) As deptName,
       max(A.开单人) As dr_name,
       max(b.id) as deptId,
       max(f.专业技术职务) As dr_title,
       Sum(A.应收金额) * 100 As payAmout,
       max(d.挂号单) As clinicSeq,
       max(a.病人id) As pt_id,
       max(A.姓名) As pt_name,
       max(a.标识号) as pt_medicalno,     
  regexp_replace(listagg(a.no, ',') within group(order by  a.no),'([^,]+)(,\1)+','\1') as prescriptionIds
  from 门诊费用记录 A,
       部门表       B,
       收费项目目录 C,
       病人医嘱记录 D,
       部门表       E,
       人员表       F
 where A.记录状态 = 0
   And 记录性质 = 1
   AND A.医嘱序号 = D.ID(+)
   and A.开单部门ID = B.ID
   And A.执行部门ID = E.Id
   And A.收费细目ID = C.ID
   and a.登记时间 >= sysdate - 1
   and A.开单部门ID = B.Id
   and A.开单人 = f.姓名
   and A.结帐ID Is Null
   and a.病人id = 407990
 GROUP BY Zl_Get_人员id(a.开单人)
 order by  regexp_replace(listagg(a.no, ',') within group(order by  a.no),'([^,]+)(,\1)+','\1') desc
 
 
                  

然后再postman调用的时候发现了另外一个问题 oracle不识别这串正则表达式
原因是oracle乱码…
oracle 11g的 listagg() WITHIN GROUP () 行转列函数_第5张图片

所以要在将’’ 再加一个’’
问题才算完美解决!!! 真的坑…

你可能感兴趣的:(emmm)