现有结构id pid cheng chu jisuan
1 0 1 6
2 1 2 6
3 1 3 6
想得到如下结果,从外部给一个变量,然后参与计算,公式如下:id pid cheng chu jisuan
1 0 1 6 变量*cheng/chu
2 1 2 6 面的结果继承下来
3 1 3 6 以此类推
谢谢大家了。。
1 0 1 6
2 1 2 6
3 1 3 6
想得到如下结果,从外部给一个变量,然后参与计算,公式如下:id pid cheng chu jisuan
1 0 1 6 变量*cheng/chu
2 1 2 6 面的结果继承下来
3 1 3 6 以此类推
谢谢大家了。。
1 0 1 6 变量*cheng/chu
2 1 2 6 (变量*cheng/chu )*cheng/chu
3 1 3 6 ((变量*cheng/chu )*cheng/chu)*cheng/chu
(
select 1 id, 0 pid, 1 chen, 6 chu ,0 jishuan from dual
union all
select 2, 1, 2, 6, 0 from dual
union all
select 3, 1, 3, 6, 0 from dual
)
select t.id,t.pid,t.chen,t.chu,&变量*chen/chu as jisuan from tab_temp t;
如果传入变量为3
结果为
ID PID CHEN CHU JISUAN
1 1 0 1 6 0.5
2 2 1 2 6 1
3 3 1 3 6 1.5
如果是的话,可以用LAG加SUM()over(order by id)这两个分析函数实现
c_id number(20);
v_jisuan number(4,3);
danjia varchar2(20);
cursor cur is select c.id from tab_temp c;
begin
open cur;
loop
fetch cur into c_id;
/*DBMS_OUTPUT.put_line(c_id || ':'||nvl(v_jisuan,0));*/
update tab_temp set jisuan = nvl(v_jisuan,&t)*chen/chu where id=c_id;
select jisuan into v_jisuan from tab_temp where id=c_id;
exit when cur%notfound;
end loop;
close cur;
end;
结果:
1 0 1 6 1.000
2 1 2 6 0.333
3 1 3 6 0.084
可以写个过程来处理,如果要用sql完成的话,就得自己构造一个聚焦函数,有兴趣的话参照
http://yangtingkun.itpub.net/post/468/466369我看楼主的表结构中有pid,第三条记录本来应该是取第一条记录的jisuan值来计算的吧?
如果按楼主描述的一条一条递推来做,就更简单了
create or replace procedure proc(num in number)
as
v_num number:=num;
cursor c1 is select * from tt order by id for update;
begin
for cur1 in c1
loop
v_num:=v_num*cur1.cheng/cur1.chu;
update tt set jisuan=v_num where current of c1;
end loop;
commit;
end proc;
begin
proc(6);
end;
传入变量,再查看计算值
select * from tt