我写了一个小应用程序来帮助我和我的室友管理欠钱的人。人们将他们的债务(例如每周购物的付款)输入到Web界面中,然后将其记录到数据库中。
数据库有3个表:
User { Name, Id }
Expenditure { Pennies, Id, Payer (User.Id) }
Debt { Expenditure (Expenditure.Id), User (User.Id) }
因此,从一个人到一个人的债务与贷方的Id一起进入“支出”表,并在每个“债务人”的债务表中排成一行。每周商店进入支出单行,然后所有四个室友作为债务人分成4行(在这种情况下,1人被列为贷方和债务人)。任何一个人欠特定支出的金额是总支出除以支付债务人的债务人数(即债务表中提及的次数)
希望这有意义!
我的问题是编写一些SQL来计算谁欠了什么。我想写一个查询来计算人与人之间的总债务,这需要得到所有参考贷款人的支出和所有参考债务人的债务,并且(实际上)需要将所有支出的所有支出的总和加起来。通过引用它的债务数量。
然后我可以通过以下方式计算未偿债务总额:
Debt(A, B) - Debt(B, A)
目前我有这个SQL:
SELECT
SUM("Pennies") / (SELECT COUNT(*) FROM public."Debt", public."Expenditure" WHERE public."Expenditure"."Id" = public."Debt"."Expenditure") As "Refs"
FROM
public."Debt",
public."Expenditure"
WHERE
public."Debt"."User" = $debtorId
AND
public."Expenditure"."Payer" = $lenderId
AND
public."Expenditure"."Id" = public."Debt"."Expenditure"
看起来正确,但是当我手动添加值时,我会得到不同的数字。
编辑::回应以下答案之一。我有显示的份额数,但似乎总是显示1 :(
SELECT
shares
FROM
public."Debt",
public."Expenditure",
(SELECT COUNT(*) as "shares", public."Expenditure"."Id" as "Id" FROM public."Expenditure" GROUP BY public."Expenditure"."Id") as "debtors"
WHERE
public."Debt"."User" = 4
AND
public."Expenditure"."Payer" = 1
AND
public."Expenditure"."Id" = public."Debt"."Expenditure"
AND
"debtors"."Id" = public."Debt"."Expenditure"
答案 0 :(得分:1)
仔细检查您用于计算欠债人数的SQL - 您当前的代码计算系统中所有债务的部分总数。
该子选择应该可以移到FROM
部分
(SELECT Debt.Id , COUNT(*) as shares FROM Debt INNER JOIN Expenditure on Debt.Expenditure=Expenditure.Id GROUP BY Debt.Id) as debtors
并添加where子句 -
AND debtors.Id = Expenditure.Id
然后你可以
SELECT SUM(Pennies/shares) ...
答案 1 :(得分:0)
我不明白“除以引用它的债务数量”这一部分。你实际做的是除以数据库中Depts的总数(前提是它们都有一个支出)。