oracle累计求和 -电脑资料

电脑资料 时间:2019-01-01 我要投稿
【www.unjs.com - 电脑资料】

    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

    //

最新文章