现有结构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.   

    id pid cheng chu jisuan 
    1  0    1    6  变量*cheng/chu 
    2  1    2    6  (变量*cheng/chu )*cheng/chu
    3  1    3    6  ((变量*cheng/chu )*cheng/chu)*cheng/chu
      

  2.   

    with tab_temp as
    (
    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
      

  3.   

    你是按照ID顺序来叠加的?
    如果是的话,可以用LAG加SUM()over(order by id)这两个分析函数实现
      

  4.   

    declare 
    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
      

  5.   

    这不是累加,是连乘了..oracle里没有这样的函数
    可以写个过程来处理,如果要用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