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

如何将两个独立SELECT查询结果相减生成patient表的current_balance字段

解决方法:计算患者当前余额

嘿,这事儿好办!你要的就是把每个患者的总就诊费用减去他们的总付款金额,生成current_balance字段对吧?我给你两种清晰实用的实现方式,都能覆盖所有患者(包括那些没有就诊记录或付款记录的):

方法1:使用关联子查询

这种写法比较紧凑,直接在SELECT语句里嵌套子查询来获取每个患者的总费用和总付款:

SELECT
  p.patient_id,
  -- 总费用,无就诊记录时显示0
  COALESCE((SELECT SUM(cost) FROM appointment a WHERE a.patient_id = p.patient_id), 0) AS total_cost,
  -- 总付款,无付款记录时显示0
  COALESCE((SELECT SUM(payment_amount) FROM payment pay WHERE pay.patient_id = p.patient_id), 0) AS total_payments,
  -- 计算当前余额
  COALESCE((SELECT SUM(cost) FROM appointment a WHERE a.patient_id = p.patient_id), 0) - 
  COALESCE((SELECT SUM(payment_amount) FROM payment pay WHERE pay.patient_id = p.patient_id), 0) AS current_balance
FROM patient p;

这里用COALESCE函数的原因是:如果某个患者没有任何就诊或付款记录,子查询会返回NULL,用COALESCE可以把NULL转换成0,避免余额计算结果变成NULL。

方法2:使用CTE(公共表表达式)

这种写法可读性更强,先把总费用和总付款的统计逻辑单独抽出来,再关联到患者表:

WITH PatientTotalCosts AS (
  SELECT
    patient_id,
    SUM(cost) AS total_cost
  FROM appointment
  GROUP BY patient_id
),
PatientTotalPayments AS (
  SELECT
    patient_id,
    SUM(payment_amount) AS total_payments
  FROM payment
  GROUP BY patient_id
)
SELECT
  p.patient_id,
  COALESCE(ptc.total_cost, 0) AS total_cost,
  COALESCE(ptp.total_payments, 0) AS total_payments,
  COALESCE(ptc.total_cost, 0) - COALESCE(ptp.total_payments, 0) AS current_balance
FROM patient p
LEFT JOIN PatientTotalCosts ptc ON p.patient_id = ptc.patient_id
LEFT JOIN PatientTotalPayments ptp ON p.patient_id = ptp.patient_id;
  • CTE把两个统计逻辑拆分,让代码结构更清晰,后期维护起来更方便;
  • LEFT JOIN确保所有患者都被包含在结果里,哪怕他们没有就诊或付款记录;
  • 同样用COALESCE处理NULL值,保证余额计算的准确性。

内容的提问来源于stack exchange,提问作者madferit247

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:26:13