我有一个MySQL表设置如下:
debts
--------------------------
owed_by | owed_to | amount
--------|---------|-------
Alice | Bob | 5
Bob | Jane | 10
Alice | Jane | 10
Jane | Bob | 5
在MySQL中是否可以编写一个查询来返回每个人所欠的总额?他们欠谁的并不重要,我只想归还每个人和(总人欠 - 总人数欠款)
获得总欠款很容易
SELECT `owed_by`, SUM(`amount`) as 'Total Debt'
FROM `debts`
GROUP BY `owed_by`
ORDER BY SUM(`amount`) DESC
但我无法弄清楚如何减去欠款。
另外,作为一般规则,在MySQL(如果可能)或PHP中执行此类操作会更好吗?
以下是我的示例数据的SQL小提琴:http://sqlfiddle.com/#!2/dd7cf/1
答案 0 :(得分:3)
你可以将双方结合起来:
select Person, sum(debt) as 'Total Debt'
from (
select owed_by as 'Person', amount as 'debt'
from debts
union all
select owed_to, -1*amount
from debts
) as q
group by Person;
答案 1 :(得分:2)
SELECT owed.owed_by, owed.amount - coalesce(owns.amount, 0) as `Total Debt`
FROM (
select owed_by, sum(amount) as amount
from debts
group by owed_by
) owed
left join (
select owed_to, sum(amount) as amount
from debts
group by owed_to
) owns on owed.owed_by = owns.owed_to
ORDER BY `Total Debt` DESC
答案 2 :(得分:1)
SELECT od.person, od.amount - COALESCE(ow.amount, 0) AS balance
FROM (SELECT owed_to AS person, SUM(amount) AS amount FROM debts GROUP BY owed_to) od
LEFT OUTER JOIN (SELECT owed_by AS person, SUM(amount) AS amount FROM debts GROUP BY owed_by) ow
ON od.person = ow.person
UNION
SELECT owed_by, SUM(amount) * (-1) FROM debts
WHERE owed_by NOT IN (SELECT DISTINCT owed_to FROM debts)
GROUP BY owed_by;
答案 3 :(得分:0)
SELECT `owed_by`, SUM(`amount`) as 'Total Debt'.
(select sum(amount) from debts d2 where d1.owed_by = d2.owed_to) as `Total Plus`
FROM `debts` d1
GROUP BY `owed_by`
ORDER BY SUM(`amount`) DESC