Сложная арифметика MySQL

3

У меня есть таблица 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

спросил(а) 2012-09-25T16:22:00+04:00 7 лет, 1 месяц назад
4
4 ответа
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;

ответил(а) 2012-09-25T16:43:00+04:00 7 лет, 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

ответил(а) 2012-09-25T16:48:00+04:00 7 лет, 1 месяц назад
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;

ответил(а) 2012-09-25T16:58:00+04:00 7 лет, 1 месяц назад
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

ответил(а) 2012-09-25T16:29:00+04:00 7 лет, 1 месяц назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема