您的位置:首页 > 数据库 > Oracle

oracle按开始时间和结束时间进行数据拆分的自定义函数

2014-12-17 16:52 309 查看

oracle按开始时间和结束时间进行数据拆分的自定义函数

故事背景:前段时间做数据报表时,遇到统计每个月的的住院人次(注意是“人次”,不是“人数”)怎么办呢,查询了资料(度娘),只发现了“兔子”大神写的有点靠谱(意思是有                     点 高深),但是采用递归方法,数据少还可以接受,但我的数据量是亿级,怎么办呢,看来不能偷懒了,只能自己动手了,写的不好,或者有技术bug,或者有更好                     的, 请call me(留言)
                   多多包涵,共同成长

1)首先要创建一直表(admin_work_area),用来存储信息

create or
replace function fun_admin(d_tiem
in date)  --d_tiem 是传入的时间
return number
as v_name number;
begin
DECLARE
     CURSOR  --游标
     crs_testAvg
     IS
     select 住院就诊流水号,入院科室编码,入院时间,出院时间,出院科室名称,出院科室编码,sc
from (
select d.住院就诊流水号,d.入院科室编码,d.出院科室编码,d.入院时间,d.出院时间,d.出院科室名称,
round(d.出院时间 - d.入院时间)
as sc from dc_出院登记表 d
where d.出院时间 >= d_tiem) zd;
     v_emp crs_testAvg%rowtype;
     numinfo number(10);
      i number(10);
      j number(10):=0;
      ij number(10):=0;
     begin
     for v_emp
in crs_testAvg loop
       i:=0;

       numinfo:=v_emp.sc;
    --dbms_output.put_line(v_emp.sc);
       while i
<= numinfo loop
         ij:=i;
         select
count(*) into j
from admin_work_area r where r.patient_id
= v_emp.住院就诊流水号and r.i
= ij ;
        -- dbms_output.put_line(v_emp.住院就诊流水号 ||  LPAD( i,3,'--')||LPAD( j,3,'--') );
         if j=0
then
             insert
into admin_work_area(dept_name,dept_id
,open_time,patient_id,sj,i)
values( v_emp.出院科室名称,v_emp.出院科室编码,v_emp.入院时间+i,v_emp.住院就诊流水号,to_char(v_emp.入院时间+i,'yyyy-mm'),i);
             commit;
         end
if;
         i:=i+1;
       end
loop;
     end
loop;
     v_name:=1;
     return v_name;
end;
end fun_admin;

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐