2013-03-29 61 views
2

我正在爲分享賬單的人創建一個小型的自動定價網絡應用程序。MySQL交易自動清算程序計算查詢

快速舉例,如果山姆,比爾和吉姆都住在一起,並分享電費單,煤氣費和寬帶費等常見賬單,他們應該能夠將每筆交易輸入到Web應用程序,計算誰應該向誰支付什麼。

有兩個表涉及這個問題:'transactions'和'transactionusers'。

交易: ID,用戶名,零售商,項目,日期

Transactionusers: ID,TransactionID的,金額,用戶名

當山姆增加了電費一個 '交易' 記錄($ 90 )並且將這筆金額平均分配給同屋人,將3筆記錄添加到'交易用戶'表中。

我希望能夠編寫一個SQL查詢來計算所有用戶之間的所有交易的總和,然後拿走反向交易(如果山姆欠賬50美元,賬單欠薩姆20美元,那麼結算是比爾欠薩姆$ 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 

示例數據

假設用戶ID是薩姆(1),比爾(2),吉姆(3)

交易:

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

Transactionusers:

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

有什麼理由不中的示例記錄中是分裂的能力不同用戶之間的賬單不平等;例如:如果吉姆一直住在房子裏一個月,他可能會拿起更多的賬單

+0

你可以用Sam和Bill顯示你的小例子的數據嗎?我沒有看到這將如何表現在你的表格結構中。 –

+0

當然 - 已更新主要問題 – user2060944

回答

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