我在用 oracle 写函数的时候有这么一段语句
declare a recode;  --声明一个记录类型变量
declare sum numeric;   --声明一个numeric类型变量
begin
sum=0;
for a in select id,name,num from table  --循环,此处a只取一条记录
loop
sum=sum+a.num;    --累加
a.num=sum;        --把值赋给该记录的num列
return next a;    --返回该行
end loop;         --获取select id,name,num from table下一条记录,直到记录遍历结束
return;
end;
这段语句是用循环遍历结果集计算后返回请问在sql中如何做到?  不可使用游标

解决方案 »

  1.   

    是不是从第条记录开始向下累加,累加的值放入相应记录的num中
    declare @num decimal(18,2)
    set @num=0
    update [table] 
    set num=@num,@num=@num+num
      

  2.   

    wzh1215(懒猫) 正解不过建议num=@num和@num=@num+num位置掉换变成@num=@num+num,num=@num一下才符合LZ要求
      

  3.   

    我只需要查询  不是修改就是从表 a 中 
    00001 番茄酱 包 100 0
    00001 番茄酱 包 20  0
    00001 番茄酱 包 10  0
    得到结果  00001 番茄酱 包 100 100
    00001 番茄酱 包 20  120
    00001 番茄酱 包 10  130 1不能用游标(因为效率不好)
    2不能用identity 因为已经有一个,且原表中的identity列在经过排序后肯定会被打乱,因而是不能用的.
      

  4.   

    表 a 
    pid    pname  pw  num sum
    00001  番茄酱 包  100  0
    00001  番茄酱 包  20   0
    00001  番茄酱 包  10   0declare @num decimal(18,2)
    set @num=0
    update [table] 
    set @num=@num+num,sum=@num
      

  5.   

    create table A(col1 char(5), col2 nvarchar(10), col3 nvarchar(10), col4 int)
    insert A select '00001', '番茄酱', '包', 100
    union all select '00001', '番茄酱', '包', 20
    union all select '00001', '番茄酱', '包', 10
    select ID=identity(int, 1, 1),* into #T from Aselect *, col5=(select sum(col4) from #T where ID<=A.ID) from #T as A--result
    ID          col1  col2       col3       col4        col5        
    ----------- ----- ---------- ---------- ----------- ----------- 
    1           00001 番茄酱        包          100         100
    2           00001 番茄酱        包          20          120
    3           00001 番茄酱        包          10          130(3 row(s) affected)drop table A
    drop table #T
      

  6.   

    to:tangqiaojie(小米虫)
    感谢你的帮助,不过我要查询不是修改,呵呵。
    to:marco08(天道酬勤)
    临时表可以 但是不能有identity列(因为已经有一个了,且原表中的identity列在经过排序后肯定会被打乱,因而是不能用的.)  这个怎么写?