使用减法访问 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]
费用和付款栏工作正常,但我得到的余额很奇怪。以下基于:
- 该患者的 5 个治疗条目,数量为 50、25、35、45、125 (280)。
- 金额中有 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]
我正在写一个我认为对于我的医生客户来说相对简单的 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]
费用和付款栏工作正常,但我得到的余额很奇怪。以下基于:
- 该患者的 5 个治疗条目,数量为 50、25、35、45、125 (280)。
- 金额中有 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]