2

請求書を互いに共有する人々のための小さな自動決済 Web アプリを作成しています。

簡単な例として、Sam、Bill、および Jim がすべて一緒に住んでいて、電気代、ガス代、ブロードバンド料金などの共通の請求書を共有している場合、各トランザクションを Web アプリに入力すると、アプリは誰が支払うべきかを自動計算します。誰に何を。

この問題に関連するテーブルが 2 つあります。'transactions' と 'transactionusers' です。

トランザクション: ID、ユーザー ID、小売業者、アイテム、日付

Transactionusers: ID、TransactionID、Amount、UserID

Sam が電気代 ($90) の「transaction」レコードを追加し、金額を同居人に均等に分割すると、3 つのレコードが「transactionusers」テーブルに追加されます。

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

サンプル レコードに示されていないのは、請求書をユーザー間で不均等に分割する機能です。例: ジムがその家に 1 か月長く住んでいた場合、請求書のより高い部分を受け取る可能性があります。

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 に答える