当前位置: 代码迷 >> Oracle开发 >> 求教Oracle循环赋值的有关问题
  详细解决方案

求教Oracle循环赋值的有关问题

热度:219   发布时间:2016-04-24 06:24:46.0
求教Oracle循环赋值的问题
问题: 现在有表 table1(a,b,c) ,a列为序号, b列是给定的值,C列 第1行是50,后续为空。
现在要为C列赋值, C的值=前一行的c*3/5 + 本行的b*2/5。

例子 
表中有数据
a      b      c
1    10     50
2     20         
3     15        
4     17      

a=2 行 c =50*3/5+20*2/5=38
a=3 行 c=38*3/5+15*2/5=28.8
a=4 行 c=28.8*3/5+17*2/5=24.08

请问这种情况能用sql语句实现吗?怎么实现?

------解决思路----------------------
with table1 as
(
select 1 aa, 10 bb, 50 cc from dual union all
select 2, 20, null from dual union all
select 3, 15, null from dual union all
select 4, 17, null from dual
)
,table2(aa,bb,cc,lvl) as (  
select aa,bb,cc, 1 lvl  
from table1 aaa
union all  
select bbb.aa,bbb.bb,ccc.cc*0.6+bbb.bb*0.4, ccc.lvl + 1  
from table1 bbb , table2 ccc
where bbb.aa=ccc.aa+1
)
select aa, bb, cc from table2 where cc is not null

------解决思路----------------------
WITH TABLE1 AS
 (SELECT 1 A, 10 B, 50 C
    FROM DUAL
  UNION ALL
  SELECT 2, 20, NULL
    FROM DUAL
  UNION ALL
  SELECT 3, 15, NULL
    FROM DUAL
  UNION ALL
  SELECT 4, 17, NULL
    FROM DUAL)
    
SELECT T.A,
       T.B,
       CASE T.A
         WHEN 1 THEN
          T.C
         ELSE
          (SELECT X1.C FROM TABLE1 X1 WHERE X1.A = 1) * POWER(3 / 5, A - 1) +
          (SELECT SUM(CASE X2.A
                        WHEN 1 THEN
                         0
                        ELSE
                         X2.B
                      END * 2 / 5 * POWER(3 / 5, T.A - X2.A))
             FROM TABLE1 X2
            WHERE X2.A < T.A) + T.B * 2 / 5
       END C
  FROM TABLE1 T;



数据量大的话建议还是用存储过程
------解决思路----------------------
引用:
我的数据量比较大,大概几百万条,请问存储过程的话怎么写?

如果表设计和例子中一样的话,按照id排序,通过游标更新c字段

DECLARE
  V_C NUMBER;
  CNT NUMBER := 0;
BEGIN
  FOR X IN (SELECT A, B, C FROM TABLE1 ORDER BY A) LOOP
    IF X.A = 1 THEN
      V_C := X.C;
    ELSE
      V_C := V_C * 3 / 5 + X.B * 2 / 5;
      UPDATE TABLE1 SET C = V_C WHERE A = X.A;
    END IF;
    CNT := CNT + 1;
    IF CNT = 1000 THEN
      COMMIT;
      CNT := 0;
    END IF;
  END LOOP;
  COMMIT;
END;
  相关解决方案