假设我有一个这样的表:
id pay
-- ---
1 10
2 20
3 30
4 40
5 50
6 60
我想用上面的表格创建一个视图:
id pay paid_before
-- --- -------------
1 10 0
2 20 10
3 30 30
4 40 60
5 50 100
6 60 150
" paid_before"是具有较小id的支付行的总和。
我怎么能做这份工作?
答案 0 :(得分:1)
这可以实现你想要的。
SELECT p1.id,p1.pay, sum(p2.pay) as Paid_Before FROM PAYMENTS P1 LEFT JOIN
PAYMENTS P2 ON p1.id > p2.id
GROUP BY p1.id, p1.pay
请参阅此sql fiddle
答案 1 :(得分:0)
在MySQL中,这可以通过变量最有效地完成:
select p.id, p.pay, (@p := @p + p.pay) - p.pay as PaidBefore
from payments p cross join
(select @p := 0) vars
order by id;
虽然这不是标准的SQL(我通常更喜欢),但这没关系。标准SQL解决方案是使用累积和:
select p.id, p.pay, sum(p.pay) over (order by p.id) - p.pay as PaidBefore
from payments p;
许多数据库都支持这种语法,但不支持MySQL。
SQL Fiddle(由Atilla提供)是here。