请大家帮忙,关系数据计算累加的问题。。。。。

lingtw 2009-10-21 02:46:49
现有结构

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 以此类推


谢谢大家了。。。。。。。。
...全文
103 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
小灰狼W 2009-10-22
  • 打赏
  • 举报
回复
这不是累加,是连乘了..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
iqlife 2009-10-21
  • 打赏
  • 举报
回复
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
cosio 2009-10-21
  • 打赏
  • 举报
回复
楼主的题目应该是累计乘! 等同于累计加!
lingtw 2009-10-21
  • 打赏
  • 举报
回复
能给一个例子吗???
hebo2005 2009-10-21
  • 打赏
  • 举报
回复
你是按照ID顺序来叠加的?
如果是的话,可以用LAG加SUM()over(order by id)这两个分析函数实现
cosio 2009-10-21
  • 打赏
  • 举报
回复
我现在的想法只能是用游标了?
cosio 2009-10-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 java3344520 的回复:]
SQL codewith tab_tempas
(select1 id,0 pid,1 chen,6 chu ,0 jishuanfrom dualunionallselect2,1,2,6,0from dualunionallselect3,1,3,6,0from dual
)select t.id,t.pid,t.chen,t.chu,&变量*chen/chuas jisuanfrom 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

[/Quote]

这样子不合要求!
lingtw 2009-10-21
  • 打赏
  • 举报
回复
我想要的是第一条是变量计算,而我的第二条是把第一条的结果当成变量,第三条是第二条的结果运算。
iqlife 2009-10-21
  • 打赏
  • 举报
回复
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
lingtw 2009-10-21
  • 打赏
  • 举报
回复
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
lingtw 2009-10-21
  • 打赏
  • 举报
回复
就是将上一条的计算结果用到下一条中。
hebo2005 2009-10-21
  • 打赏
  • 举报
回复
没看懂逻辑关系
举例说明下你想要的结果

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧