【问题标题】:Help me! My SQL is broken :(帮我!我的 SQL 坏了:(
【发布时间】: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


【解决方案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) ...

【讨论】:

  • 看起来很有希望,但“SELECT Debt”位到底在做什么? postgresql 不喜欢那样但是我格式化它:/
  • 哎呀,那是我看你的架构不够近...编辑修复
  • 好的,我让它工作了,但它总是显示 1 作为共享数量:(
【解决方案2】:

我不明白“除以引用它的债务数量”的部分。你实际做的是除以数据库中的部门总数(前提是它们都有支出)。

【讨论】:

    猜你喜欢
    • 2014-11-07
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多