试试这个运行总数:http ://www.sqlfiddle.com/#!2/ce765/1
select
bid as no, value,
@rt := if(aid = @last_id, @rt + value, value) as total,
@last_id := aid
from table_b b, (select @rt := 0 as x, @last_id := null) as vars
order by b.bid, b.aid;
输出:
| NO | VALUE | TOTAL | @LAST_ID := AID |
|----|-------|-------|-----------------|
| 1 | 10 | 10 | 1 |
| 2 | 15 | 25 | 1 |
| 3 | 5 | 5 | 2 |
| 4 | 10 | 15 | 2 |
| 5 | 25 | 25 | 3 |
| 6 | 40 | 65 | 3 |
然后加入表A,最终查询:
select x.no, x.aid, x.value, x.total, a.value - x.total as balance
from
(
select
bid as no, aid, value,
@rt := if(aid = @last_id, @rt + value, value) as total,
@last_id := aid
from table_b b, (select @rt := 0 as x, @last_id := null) as vars
order by b.bid, b.aid
) as x
join table_a a using(aid)
输出:
| NO | AID | VALUE | TOTAL | BALANCE |
|----|-----|-------|-------|---------|
| 1 | 1 | 10 | 10 | 90 |
| 2 | 1 | 15 | 25 | 75 |
| 3 | 2 | 5 | 5 | 45 |
| 4 | 2 | 10 | 15 | 35 |
| 5 | 3 | 25 | 25 | 125 |
| 6 | 3 | 40 | 65 | 85 |
现场测试:http ://www.sqlfiddle.com/#!2/ce765/1
更新
不依赖于列出价排序,分组运行总计不会受到影响:http ://www.sqlfiddle.com/#!2/6a1e6/3
select x.no, x.aid, x.value, x.total, a.value - x.total as balance
from
(
select
@rn := @rn + 1 as no, aid, value,
@rt := if(aid = @last_id, @rt + value, value) as total,
@last_id := aid
from table_b b, (select @rt := 0 as x, @last_id := null, @rn := 0) as vars
order by b.aid, b.bid
) as x
join table_a a using(aid)
输出:
| NO | AID | VALUE | TOTAL | BALANCE |
|----|-----|-------|-------|---------|
| 1 | 1 | 10 | 10 | 90 |
| 2 | 1 | 15 | 25 | 75 |
| 3 | 1 | 7 | 32 | 68 |
| 4 | 2 | 5 | 5 | 45 |
| 5 | 2 | 10 | 15 | 35 |
| 6 | 3 | 25 | 25 | 125 |
| 7 | 3 | 40 | 65 | 85 |
现场测试:http ://www.sqlfiddle.com/#!2/6a1e6/3