【发布时间】:2010-12-07 18:22:02
【问题描述】:
我编写了一个小应用程序来帮助我和我的室友管理谁欠谁的钱。人们将他们的债务(例如每周购物的付款)输入网络界面,然后记录到数据库中。
数据库有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"
【问题讨论】:
-
这是一个有趣的设计,它迫使所有债务人同时结算,您可能想要添加一个
Repayment表,除非您只想通过支付团体物品来处理还款 - 即没有钱应该直接转手 -
是的,我们的想法是我们从不交换任何实际货币,我们只是继续为东西付费。如果还款 进行,那么这就是作为还款人的贷方和作为收款人的单一债务人的债务
标签: sql database postgresql