【问题标题】:Access SQL SUM with subtraction使用减法访问 SQL SUM
【发布时间】:2018-03-28 18:47:09
【问题描述】:

我正在为我的一位医生客户编写一个我认为相对简单的 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 美元

【问题讨论】:

  • 为什么要使用子查询?

标签: sql tsql ms-access ms-access-2016


【解决方案1】:

通过使用这个 FROM 子句:

FROM Patients,Treatments,PAYMENTS

您正在创建笛卡尔积。 这意味着您的余额总和计算将乘以每个相应表中的记录数(患者中的 1 个,治疗中的 5 个,PAYMENTS 中的 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]

【讨论】:

  • 工作就像一个魅力,我很感激!
【解决方案2】:
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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-11
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2019-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多