在sql中我有如下表格数据
id type amount
1 type1 2000
2 type1 1000
3 type2 500
4 type3 3000
5 type1 2000
6 type2 500
7 type3 5000
8 type1 1000
我想在select语句中获取数据,如下所示
id type amount current
1 type1 2000 2000
2 type1 1000 1000
3 type2 500 500
4 type3 3000 3000
5 type1 2000 3000
6 type2 -500 0
7 type3 5000 2000
8 type1 -1000 4000
等等 这意味着每种类型必须具有基于金额类型的当前总金额 并且它需要没有while循环,因为它需要很长时间才能执行
for eg:
in type 1
ID Amount current
1 2000-add 2000
2 1000-sub 1000
3 2000-add 3000
4 1000-add 4000
怎么做
答案 0 :(得分:0)
自我加入就足够了:
select
t1.id, t1.type, t1.amount, sum(t2.amount) as currenttotal
from
t t1 inner join t t2
on t1.id >= t2.id and t1.type = t2.type
group by
t1.id, t1.type, t1.amount
order by t1.id
<强> Test it at sql fiddle 强>:
| ID | TYPE | AMOUNT | CURRENTTOTAL |
--------------------------------------
| 1 | type1 | 2000 | 2000 |
| 2 | type1 | 1000 | 3000 |
| 3 | type2 | 500 | 500 |
| 4 | type3 | 3000 | 3000 |
| 5 | type1 | 2000 | 5000 |
| 6 | type2 | 500 | 1000 |
| 7 | type3 | 5000 | 8000 |
| 8 | type1 | -1000 | 4000 |
<强>解释强>
您不能使用windowed函数,因为您不会聚合相同值的所有行,而是聚合相同值的前一行。然后,您需要一个非equi连接到同一个表,您可以加入相同值(t1.id >= t2.id
)的所有先前行(t1.type = t2.type
)
答案 1 :(得分:0)
我认为这个查询有效:
选择id,type,amount,(从mytable t1中选择sum(amount),其中t1.type = t2.type和t1.id&lt; = t2.id)来自mytable t2的currenttotal