You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:38:48