当前位置:数据库 > Oracle >>

oracle累计求和

oracle累计求和
 
//将当前行某列的值与前面所有行的此列值相加,即累计求和:   
//方法一:   
with t as(    
     select 1 val from dual union all    
     select 3 from dual union all    
     select 5 from dual union all    
     select 7 from dual union all    
     select 9 from dual)    
select val,    
       sum(val)    
       over (order by rownum rows between unbounded preceding and current row)    
       sum_val    
from t    
group by rownum,val    
order by rownum;    
       VAL    SUM_VAL    
---------- ----------    
         1          1    
         3          4    
         5          9    
         7         16    
         9         25    
//解析:    
//sum(val)计算累积和;    
//order by rownum 按照伪列rownum对查询的记录排序;    
//between unbounded preceding and current row:定义了窗口的起点和终点;    
//unbounded preceding:窗口的起点包括读取到的所有行;    
//current row:窗口的终点是当前行,默认值,可以省略;   
//  
//方法二:  
with cte_1 as(    
     select 1 val from dual union all    
     select 3 from dual union all    
     select 5 from dual union all    
     select 7 from dual union all    
     select 9 from dual  
     )   
,cte_2 as(  
    select rownum rn,val from cte_1  
    )  
select a.val , sum(b.val) sum_val  
from cte_2 a , cte_2 b  
where b.rn <= a.rn  
group by a.val  
/  
//方法三:  
//创建一个递归函数,求和  
//f(n) = x + f(n-1)  
create table t  
as  
select 1 id,1 val from dual union all  
select 2,3 from dual union all  
select 3,5 from dual union all  
select 4,7 from dual union all  
select 5,9 from dual  
/  
create or replace function fun_recursion(x in int)   
return integer is  
       n integer :=0;  
begin  
     select val into n   
     from t  
     where id=x;  
     if x=1 then  
        return n;  
     else  
         return n + fun_recursion(x-1);  
     end if;  
     exception  
     when others then  
          dbms_output.put_line(sqlerrm);  
end fun_recursion;  
/  
select val,fun_recursion(id) sum_val from t;  
       VAL    SUM_VAL  
---------- ----------  
         1          1  
         3          4  
         5          9  
         7         16  
         9         25  
//  
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,