帮我!我的SQL坏了:(

时间:2010-12-07 09:32:09

标签: sql database postgresql

我写了一个小应用程序来帮助我和我的室友管理欠钱的人。人们将他们的债务(例如每周购物的付款)输入到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"

2 个答案:

答案 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的总数(前提是它们都有一个支出)。