客户最近想把原来的一张统计报表改成SQL视图,报表可以通过参数传入动态生成统计信息,
而视图不能传入参数,所以只能用存储过程去动态生成。
数据表结构
[list]
[*] cost_title_id //费用科目,分组字段
[*] fee //费用,统计字段,要求对一年中12个月的费用分别统计
[*] maint_dept //维护部门,查询条件
[*] fee_type_1 //费用分类,查询条件
[*] out_account_date //抛帐日期
[/list]
生成视图的存储过程
月份子查询统计
而视图不能传入参数,所以只能用存储过程去动态生成。
数据表结构
[list]
[*] cost_title_id //费用科目,分组字段
[*] fee //费用,统计字段,要求对一年中12个月的费用分别统计
[*] maint_dept //维护部门,查询条件
[*] fee_type_1 //费用分类,查询条件
[*] out_account_date //抛帐日期
[/list]
生成视图的存储过程
create or replace procedure P_FYKZ_CREATE_VIEW_SUBJECT( P_YEAR IN VARCHAR2 ,P_MAIN_DEPT IN VARCHAR2, FEE_TYPE_1 IN VARCHAR2 ) is
EXESTR VARCHAR2(5000);
begin
EXESTR := 'CREATE OR REPLACE VIEW FYKZ_VIEW_SUBJECT AS(select p.cost_title_id';
--通过for循环对12个月份进行分别统计,函数GETSUBSELFORSUM可以获得子查询字符串
for i in 1..12 loop
if LENGTH(i) = 1 then
EXESTR := EXESTR || ',' || GETSUBSELFORSUM(P_YEAR,'0' || i,P_MAIN_DEPT,FEE_TYPE_1);
else
EXESTR := EXESTR || ',' || GETSUBSELFORSUM(P_YEAR,i,P_MAIN_DEPT,FEE_TYPE_1);
end if;
end loop;
EXESTR := EXESTR || ' from fykz_b_result_data p where p.cost_title_id is not null and substr(p.out_account_date,0,4) = '|| P_YEAR ||' group by p.cost_title_id )';
--生成视图
execute immediate EXESTR;
end;
月份子查询统计
create or replace function GETSUBSELFORSUM(P_YEAR IN VARCHAR2, P_MONTH IN VARCHAR2 ,P_MAIN_DEPT IN VARCHAR2, FEE_TYPE_1 IN VARCHAR2) return varchar2 is
Result varchar2(500);
begin
--对传入月份进行sum合计
Result := '(select sum(t.fee) from fykz_b_result_data t where substr(t.out_account_date,0,6) = '|| P_YEAR || P_MONTH || '
and t.cost_title_id = p.cost_title_id';
--不为空时插入维护部门查询条件
if LENGTH(P_MAIN_DEPT) > 0 then
Result := Result || ' and t.maint_dept = '''|| P_MAIN_DEPT || '''';
end if;
--不为空时插入费用分类查询条件
if LENGTH(FEE_TYPE_1) > 0 then
Result := Result || ' and t.fee_type_1 = '''|| FEE_TYPE_1 || '''';
end if;
Result := Result || ') AS MONTH' || P_MONTH;
return(Result);
end;

543

被折叠的 条评论
为什么被折叠?



