2

我正在为彼此共享账单的人创建一个小型自动结算器网络应用程序。

举个简单的例子,如果 Sam、Bill 和 Jim 住在一起并分担电费、煤气费和宽带费等共同账单,他们应该能够将每笔交易输入到 Web 应用程序,然后应用程序会自动计算谁应该支付对谁。

有两个表与这个问题有关:“transactions”和“transactionusers”。

交易: ID、用户 ID、零售商、项目、日期

Transactionusers: ID、TransactionID、Amount、UserID

当 Sam 添加电费账单(90 美元)的“交易”记录并将金额平均分配给室友时,3 条记录将添加到“交易用户”表中。

我希望能够编写一个 SQL 查询来计算所有用户之间所有交易的总和,然后取消反向交易(例如,如果 Sam 欠 Bill 50 美元,Bill 欠 Sam 20 美元,那么结算是 Bill 欠 Sam 30 美元)

我当前的查询允许您总结每对用户之间的总交易价值,但不带走反向交易 - 非常感谢任何帮助:

SELECT transactionusers.userID AS debtor, SUM(amount) AS owes, transactions.userID AS toUser FROM transactionusers
INNER JOIN transactions ON transactions.ID = transactionusers.transactionID
WHERE transactions.userID <> transactionusers.userID
GROUP BY transactionusers.userID, transactions.userID

示例数据

假设 UserID 是 Sam (1)、Bill (2)、Jim (3)

交易:

1, 1, 'Electricity Co', 'Electricity Bill'
2, 2, 'Gas Co', 'Gas Bill'
3, 3, 'Broadband Co', 'Broadband Charge'

交易用户:

1, 1, 30, 1
2, 1, 30, 2
3, 1, 30, 3

4, 2, 20, 1
5, 2, 20, 2
6, 2, 20, 3

7, 3, 5, 1
8, 3, 5, 2
9, 3, 5, 3

示例记录中未显示的是在用户之间不均等地分配账单的能力;例如:如果吉姆在这所房子里多住一个月,他可能会拿到更多的账单

4

1 回答 1

0

您的查询很好,您只需对同一个查询进行连接并扣除结果:

SELECT transactionusers.userID AS debtor, IF(SUM(amount)-r.owes < 0, 0, SUM(amount)-r.owes) AS owes, transactions.userID AS toUser FROM transactionusers
INNER JOIN transactions ON transactions.ID = transactionusers.transactionID
LEFT JOIN (
    SELECT transactionusers.userID AS debtor, SUM(amount) AS owes, transactions.userID AS toUser FROM transactionusers
    INNER JOIN transactions ON transactions.ID = transactionusers.transactionID
    WHERE transactions.userID <> transactionusers.userID
    GROUP BY transactionusers.userID, transactions.userID
) r ON r.debtor = transactions.userID AND r.toUser = transactionusers.userID
WHERE transactions.userID <> transactionusers.userID
GROUP BY transactionusers.userID, transactions.userID   
于 2013-04-06T15:21:05.630 回答