方案介绍
针对上面介绍常规实现方案的弊端,本文从数据结构设计入手提出了“历史数据模型”解决方案。在物理表设计阶段针对这类报表问题进行特殊处理,物理表数据结构设计如下:
字段
描述
Id
ID
Project
项目
Amount
本月投资额
TotalAmount
累计投资额(截止本期)
Year
年份
Month
月份
增加了TotalAmount字段记录截止本月的累计投资额
注意:填报表设计时,该累计投资额为上个月的累计投资额+本月投资额,在填报表填报数据时自动计算得出并提交时回填至TotalAmount字段)
基于上面的数据结构,报表相关设计工作变得轻松简单:
数据集设计:project_info: select * from project_info1 where year=?year and month=?mount
其中year为动态参数,表达式为:year(now());month为动态参数,表达式为:month(now())
报表设计:
A2:显示项目信息,表达式:= project_info Select(PROJECT)
B2:显示当月投资额,表达式:= project_info .amount
C2:显示累计投资额,表达式:project_info.totalamount
D2:计算累计占比,表达式:=B2/C2
解决方案优势:
1. 增加 “累计投资”字段,每次查询直接读上个月的“累计投资”,无需根据项目进行统计运算,效率更高。
2. 首次填写没有历史数据的情况,可以手动直接输入“累计投资”,当下个月的再次填写时,累计投资就是上月的累计投资+本月投资,有效解决没有历史数据的难题。
3. 由于数据表结构和报表展现的数据形式一致,报表设计工作可按照常规的列表式报表设计即可,大大简化报表设计工作。
更多应用
上面以“累计值”为例介绍了“历史数据模型”的应用,该方案可引申应用于其他类似的报表问题中。
比如:
1.同比环比问题
表样如下:
项目
本月投资
上月投资
去年同期投资
***
****
采用“历史数据模型”,可设计数据结构如下:
字段
描述
Id
ID
Project
项目
Amount
本月投资额
PriorAmount
上月投资额
LastAmount
去年同期投资额
Year
年份
Month
月份
采用这样的数据结构设计,简单的sql查询就可以得出上月值和去年同期值,不用逐次查询上个月的值和去年相同月份的值。
2.多样化的累计问题
表样如下:
项目
本月投资
年度累计投资
季度累计投资
总累计投资
***
****
采用“历史数据模型”,可设计数据结构如下:
字段
描述
Id
ID
Project
项目
Amount
本月投资额
YearAmount
上月投资额
LastYearAmount
去年同期投资额
TotalAmount
总累计投资额
Year
年份
Month
月份
采用这样的数据结构设计,简单的sql查询就可以得出多种累计值,不用逐次查询和计算去年的投资额合计,本年的投资额合计和总的投资额合计。
注意:历史数据模型并非使用于所有的应用场景,一般在涉及周期性数据记录的历史数据获取的情况下(比如以年、月、周、日报中的同比、环比、累计运算)才会用到,建议用户评估报表需求和应用场景,合理使用该模型进行数据结构设计!