Access SQL求和减运算实现患者余额查询问题求助
嘿,我来帮你搞定这个患者余额报表的查询问题!针对你提到的三张表,我们需要确保能统计到每一位患者的治疗总费用、已支付金额,以及计算出当前余额——哪怕有些患者还没有治疗记录或者支付记录,也不能漏掉他们。
下面是适配Access语法的完整查询语句:
SELECT p.id AS [Patient ID], p.[First Name] & " " & p.[Last Name] AS [Patient Name], Nz(SUM(t.Fee), 0) AS [Total Treatment Fees], Nz(SUM(py.Amount), 0) AS [Total Payments Received], Nz(SUM(t.Fee), 0) - Nz(SUM(py.Amount), 0) AS [Current Balance] FROM ((Patients p) LEFT JOIN Treatments t ON p.id = t.Patient_id) LEFT JOIN Payments py ON p.id = py.Patient_id GROUP BY p.id, p.[First Name], p.[Last Name] ORDER BY p.[Last Name], p.[First Name];
关键细节解释:
- 左连接(LEFT JOIN):用左连接关联Patients表和另外两张表,这能保证所有患者都会出现在结果中,哪怕他们没有任何治疗或支付记录(普通内连接会直接过滤掉这些患者)。
- Nz函数:Access专属的Nz函数用来处理空值——如果某个患者没有治疗记录,
SUM(t.Fee)会返回Null,Nz会把它转换成0,避免计算余额时出现错误。支付金额的处理逻辑同理。 - 分组(GROUP BY):按患者的ID和姓名分组,确保每个患者只显示一行汇总数据,不会因为多条治疗/支付记录重复出现。
- 余额计算:直接用总治疗费用减去已支付金额得到当前余额,同样依赖Nz函数确保空值场景下的计算正确性。
额外优化建议:
如果你的业务里存在取消的治疗或者退款记录,可以通过条件过滤来调整统计逻辑:
- 比如排除取消的治疗:
Nz(SUM(IIF(t.[Is Cancelled] = False, t.Fee, 0)), 0) - 比如只统计正向支付(排除退款):
Nz(SUM(IIF(py.[Payment Type] = 'Payment', py.Amount, 0)), 0)
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

