奇葩需求:单个病人未支付列表查询接口 一个医生开的处方单显示一条数据 处方单用逗号合并,金额累计。
用处:第三方公司合并支付。
2.使用 listagg() WITHIN GROUP () 将多行合并成一行 金额合并
这里有个问题 就是单号有重复项,然后金额是没问题的
解决方案:
Oracle listagg() within group()函数 多行转一行去除重复数据
regexp_replace(listagg(a, ',') within group(order by a),'([^,]+)(,\1)+','\1') as a
注意版本问题:
查看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乱码…
所以要在将’’ 再加一个’’
问题才算完美解决!!! 真的坑…