使用减法访问 SQL SUM

Access SQL SUM with subtraction

我正在写一个我认为对于我的医生客户来说相对简单的 Access DB,他的诊所很少。我在报告患者余额时遇到问题。

我有 3 个表:

Patients (id, [First Name], [Last Name], {other cols})
Treatments (id, Fee, Patient_id, {other cols})
Payments (id, Amount, Patient_id, {other cols})

我想要一个简单地显示治疗总费用、支付的总金额和当前余额的查询。我写了以下...

Select 
 Patients.[Last Name],
 Patients.[First Name], 
 SUM(select SUM(Treatments.Fee) from Treatments Where Treatments.Patient=@PatientID)
AS CHARGES, 
 SUM(select SUM(PAYMENTS.AMOUNT) from PAYMENTS Where PAYMENTS.Patient=@PatientID)
AS PAYMENTS, 
SUM(
 (select SUM(Treatments.Fee) from Treatments Where Treatments.Patient=@PatientID)
- (select SUM(PAYMENTS.AMOUNT) from PAYMENTS Where PAYMENTS.Patient=@PatientID)
)
as Balance
FROM Patients,Treatments,PAYMENTS
WHERE Patients.ID = @PatientID
GROUP BY Patients.[Last Name],Patients.[First Name]

费用和付款栏工作正常,但我得到的余额很奇怪。以下基于:

  1. 该患者的 5 个治疗条目,数量为 50、25、35、45、125 (280)。
  2. 金额中有 3 个付款条目,15、60、25 (100)。

我预计: 费用 = 280 美元,付款 = 100 美元,余额 = 180 美元

但我得到: 费用 = 280 美元,付款 = 100 美元,余额 = 2,700 美元

Select 
 Patients.[Last Name],
 Patients.[First Name], 
 SUM( treatments.Fee) 
AS CHARGES, 
 SUM(PAYMENTS.AMOUNT) 
AS PAYMENTS, 
SUM(Treatments.Fee) 
- SUM(PAYMENTS.AMOUNT) 
as Balance
FROM Patients a join Treatments b on a.id=b.patientid join PAYMENTS c on a.id=c.patientid
WHERE Patients.ID = @PatientID
GROUP BY Patients.[Last Name],Patients.[First Name]

通过使用此 FROM 子句:

FROM Patients,Treatments,PAYMENTS

您正在创建笛卡尔积。 这意味着您的余额总和计算将乘以每个 table 中的记录数(患者中有 1 个,治疗中有 5 个,付款中有 3 个):

  • 15*费用总额- 15*付款总额= 15*280-15*100 = 4200-1500 =2700

您不需要在 FROM 子句中使用 Treatments 和 PAYMENTS,因为您在子查询中进行计算。 请改用此语句:

Select 
 Patients.[Last Name],
 Patients.[First Name], 
 SUM(select SUM(Treatments.Fee) from Treatments Where Treatments.Patient=@PatientID)
AS CHARGES, 
 SUM(select SUM(PAYMENTS.AMOUNT) from PAYMENTS Where PAYMENTS.Patient=@PatientID)
AS PAYMENTS, 
SUM(
 (select SUM(Treatments.Fee) from Treatments Where Treatments.Patient=@PatientID)
- (select SUM(PAYMENTS.AMOUNT) from PAYMENTS Where PAYMENTS.Patient=@PatientID)
)
as Balance
FROM Patients
WHERE Patients.ID = @PatientID
GROUP BY Patients.[Last Name],Patients.[First Name]