как написать запрос sql
У меня есть таблица с переводами денег со счета, в ней хранится и поступления, и траты, каким образом мне посчитать остаток по счету у пользователя
Источник: Stack Overflow на русском
У меня есть таблица с переводами денег со счета, в ней хранится и поступления, и траты, каким образом мне посчитать остаток по счету у пользователя
Посчитать сумму вложений для каждого аккаунта, сумму снятий с каждого аккаунта, найти разность между ними. Понадобится использовать COALESCE
для конвертации NULL в 0, т.к. не у всех счетов могут быть операции вложений и снятий.
Упрощенный пример для mySQL:
select acc.id, acc.name, adds.deps - subs.wdrs balance
from acc
join (
select acc.id as acc, coalesce(sum(amt),0) deps
from trans t
right outer join acc on t.to_acc = acc.id
group by to_acc
) adds on acc.id = adds.acc
join (
select acc.id as acc, coalesce(sum(amt),0) wdrs
from trans t
right outer join acc on t.from_acc = acc.id
group by from_acc
) subs on adds.acc = subs.acc;
right outer join на основную таблицу аккаунтов в подзапросах гарантируют, что для соответствущего аккаунта будет известна сумма операций данного вида.
Для входных данных:
create table acc(
id int auto_increment primary key,
name varchar(20)
);
insert into acc(name) values
('Alice'), ('Bob'), ('Charlie'), ('Dylan');
create table trans(
from_acc int,
to_acc int,
amt int
) ;
insert into trans(from_acc, to_acc, amt) values
(-1, 1, 100),
(-1, 2, 200),
(-1, 3, 250),
(-1, 4, 1500),
(1, 2, 10),
(2, 1, 15),
(1, 3, 5),
(2, 3, 5),
(4, 3, 20),
(4, -1, 100);
результат будет таким:
id name balance
1 Alice 100
2 Bob 190
3 Charlie 280
4 Dylan 1380