- .
SQL , (), - . - - , .
, , :
, : , ( 2 1 1 2)?
, :
drop procedure if exists calculate_balances;
delimiter ~
create procedure calculate_balances()
comment 'calculates running balances'
begin
declare _id int;
declare _member_id int;
declare _amount int;
declare _balance int;
declare _current_member_id int default 0;
declare _done int default 0;
declare _cursor cursor for
select id, member_id, case when status = 1 then amount else 0 end
from member_txns
order by member_id, id;
declare continue handler for not found set _done = 1;
open _cursor;
repeat
fetch _cursor into _id, _member_id, _amount;
if not _done then
if _current_member_id != _member_id then
set _balance = 0;
set _current_member_id = _member_id;
end if;
update member_txns set opening = _balance, closing = _balance + _amount where id = _id;
set _balance = _balance + _amount;
end if;
until _done end repeat;
end;~
delimiter ;
, .
:
create table member_txns (
id int,
member_id int,
status int,
amount int,
opening int,
closing int
);
insert into member_txns (id, member_id, status, amount) values
(1,2,1,1000),
(2,2,2,100),
(3,2,1,-20),
(4,2,1,10),
(5,3,1,-20),
(6,3,1,100);
call calculate_balances();
select * from member_txns;
, .