как написать запрос sql

Рейтинг: -3Ответов: 1Опубликовано: 03.03.2023

У меня есть таблица с переводами денег со счета, в ней хранится и поступления, и траты, каким образом мне посчитать остаток по счету у пользователявведите сюда описание изображения

Ответы

▲ 0

Посчитать сумму вложений для каждого аккаунта, сумму снятий с каждого аккаунта, найти разность между ними. Понадобится использовать 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