在sql server 2005中不使用while循环更新表数据

时间:2013-07-24 05:26:07

标签: sql-server-2005 select

在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                   

怎么做

2 个答案:

答案 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