每月平均人数=每天人数之和/天数每天人数计算规则:
1、计算月末最后一天人数
2、除月末最后一天人数外,其它每天的人数,都是后一天人数-当天入职人数+当天离职人数create table AA (mon varchar2(20),ruzhi varchar2(20),lizhi varchar2(20),Renshu varchar2(20))
insert into AA
select '1月1日','10','8','0' from dual
union all select '1月2日','2','0','0' from dual
union all select '1月3日','0','2','0' from dual
union all select '1月4日','0','2','50' from dual--drop table AA
表结构说明:mon 日期;ruzhi 入职人数;lizhi 离职人数;Renshu 当天人数即:1月4日人数=50
    1月3日人数=50-0+2=52
    1月2日人数=52-2+0=50
    1月1日人数=50-10+8=48人
请问根据月末人数,倒推出每天人数的循环如何写啊。

解决方案 »

  1.   

    --大概思路
    DECLARE
      v_pre_num NUMBER := 0;
      v_day_num NUMBER;
      rn        NUMBER := 0;
    BEGIN
      FOR i IN (SELECT * FROM aa ORDER BY mon DESC) LOOP
        rn := rn + 1;
        IF rn = 1 THEN
          v_pre_num := i.Renshu;
        END IF;
        v_day_num := v_pre_num + ruzhi - lizhi;
        UPDATE aa SET renshu = v_day_num WHERE mon = i.mon;
        v_pre_num := v_day_num;
      END LOOP;
      COMMIT;
    END;
    /
      

  2.   

    create table tab_date_a
    (
      ins_date      date,
      in_peo_cnt    integer,
      out_peo_cnt   integer,
      total_peo_cnt integer
    );
    truncate table tab_date_a;insert into tab_date_a values(to_date('2010-5-1','yyyy-mm-dd'),1,2,0);
    insert into tab_date_a values(to_date('2010-5-2','yyyy-mm-dd'),3,2,0);
    insert into tab_date_a values(to_date('2010-5-3','yyyy-mm-dd'),1,1,0);
    insert into tab_date_a values(to_date('2010-5-4','yyyy-mm-dd'),6,2,0);
    insert into tab_date_a values(to_date('2010-5-5','yyyy-mm-dd'),4,3,0);
    insert into tab_date_a values(to_date('2010-5-6','yyyy-mm-dd'),1,8,100);
    commit;select * from tab_date_a order by ins_date desc;declare
        i       int ;
        j       int;
    begin
        select count(*) into j from tab_date_a;
       for i in 1..j
       loop
          update tab_date_a set total_peo_cnt=(select total_peo_cnt-in_peo_cnt+out_peo_cnt
           from tab_date_a where ins_date=to_date('2010-5-6','yyyy-mm-dd')-i+1) where ins_date=
           to_date('2010-5-6','yyyy-mm-dd')-i;
           end loop;
           end;