关于银行报表开发简单思路解析(MYSQL存储过程)
需求分析:
该表为简易银行报表模板,一般为行列模式。
- 基础表设计:
1.根据业务种类建立对应业务的维度表,一般为客户维度表,产品维度表,资产维度表等
2.根据字段一、字段二等行项目,来处理加工出来一张事实表。也可以简单的理解为将最终报表中的处理逻辑单独做一张事实表。
3.根据报表字头的标题做一张码表,每一行赋予一个Index_No字段。并且按照递增排列。
4.一般都有一张时间维度表,这个都是默认建立的,可以直接用。作用就是用来截取日期段来循环插入数据。 - 处理逻辑:
1.根据报表样式中的列字段按照业务模式为指标建立若干张张临时表,表中的数据为按报表模板中的字段一等等的select结果。
2.根据临时表与码表关联select出报表样式中的所有数据(不含合计)
3.插入合计数据。
4.转换最终金额为万元。 - 伪代码:
创建存储过程,先按照思路做出两张临时表,而后把每一行的数据select出来,插入到最终报表中,接下来就把合计select出来插入到最终报表,最后把数据单位格式更新。 - 代码实现:
CREATE DEFINER=`dap_app`@`%`PROCEDURE `dap_app` . `P_F_RPT_G0602_ASSET_LIAB_SITUAT_SUB`
( IN I_BEGIN_DATE INT,
IN I_END_DATE INT
)
/*
--=========================================================================-
--对象编号:
--对象名称:
--对象表示:
--创建人:
--创建日期:
--功能描述:
--处理逻辑:
--修改说明:
--未确定问题:
--待优化问题:
--=========================================================================-
*/
begin
declare v_oc_date,v_m_begin_date int;
declare done int default 0;
-- 游标循环处理输出入参数日期区间的数据
declare cur cursor for
select oc_date from dim_date
where oc_date between i_begin_date and i_end_date
order by oc_date asc;
--将变量done设置为1,用于循环中判断是否交结束
declare continue hadnler for not found set done = 1;
--打开游标
open cur;
dateloop:loop
--游标向前走一步,取出一条记录放在变量v_oc_date中
fetch cur into v_oc_date;
if done=1 then
leave dateloop;
end if;
--获取月初数据
select min(oc_date)into v_m_begin_date
from dim_date
where oc_month = v_oc_date;
--删除输入日期表数据
delete from F_RPT_G0602_ASSET_LIAB_SITUAT_SUB
where data_dt = v_oc_date
commit;
--插入表数据
insert into F_RPT_G0602_ASSET_LIAB_SITUAT_SUB
(字段1,字段2,字段3,字段4)
with asdf as (
*** as puc1
*** as puc2
*** as puc3
***),
jubs as (
*** as puc1
*** as puc2
*** as puc3
***)
-- 行内容1
select
v_oc_date as data_dt,a.标题1,a.标题2,a.标题3,
bb.puc1, -- 此处对应临时表的对应数据 > 进而对应最终报表的第一行数据
cc.puc1 -- 此处对应临时表的对应数据 > 进而对应最终报表的第一行数据
from 码表 a
left join asdf bb on 1=1
left join jubs cc on 1=1
where Index_no = 1 -- 此处为取字头的逻辑 > 进而对应最终报表的第一行数据
union all
-- 行内容2
select
v_oc_date as data_dt,a.标题1,a.标题2,a.标题3,
bb.puc2,
cc.puc2
from 码表 a
left join asdf bb on 1=1
left join jubs cc on 1=1
where Index_no = 2 -- 此处为取字头的逻辑
...
commit;
-- 生成合计
insert into 表名
(字段名
字段名)
select
* as Index_no,
'' as categ_level1_1,
'' as categ_level1_2,
'' as categ_level1_3,
字段名,
字段名
from 最终表
where Index_no = *** -- 根据Index_no来进行合计
and 日期限制
commit;
--将相关列转换单位
update
set 字段名 = 字段名+计算式
where 日期限制
end loop dateloop
close loop
end