报表设计血泪史!给大家分享一点做报表的心得

148 阅读6分钟

报表是很多企业级系统都绕不过去的一个必要功能,大部分有几年工作经验的同行都对这种功能很是看不起。因为报表的开发都是对已有数据的整理,这个时候业务数据其实已经有了很多积累,我们只要稍微写写SQL就可以得到我们想要的结果。它的难度就在于SQL是否难写。

正常情况下,我们上面的思路是完全没有问题。但往往定制化的功能都没那么简单,经常做出了功能,却被业务人员吐槽辣鸡。所以本次针对报表设计,以我自己被自己坑的经验,做一个系统性的汇总盘点。

一 单个报表开发的具体工作

单个报表工作可分为以下几步:数据口径梳理、数据中间表设计、数据汇总、数据展示。

数据口径梳理****

数据口径是报表的第一步,也是我们报表设计最重要的一步。这个主要是细致活,可以根据以下维度汇总:

统计指标使用表使用字段统计逻辑汇总方案

数据中间表设计****

在做数据中间表设计之前,我们对数据种类要有一个基本认识。

流水表:数据只会新增的表,一般是交易流水等;

维度表:数据会增删改查的表,一般是账户表、客户表等,只记录最新的数据状态;

拉链表:基于维度表新增数据有效开始时间、数据有效结束时间两个字段,一般用于记录账户的全生命周期;如果账户在5月1日时性别是男、5月2日时性别是女,那么表里则有两条数据:

账户性别数据有效开始时间数据有效结束时间
A2024-5-12024-5-2
A2024-5-22224-5-2

 

一般在业务系统中的数据是相当散乱的,为了将数据变成可用数据,我们需要对这些原始数据进行:数据质量审计、数据抽取、数据转换、数据输出等一系列工作。也因此诞生了ETL工程师这一岗位,有兴趣的同学可以了解下。

在通常的数据治理方案中,需要对数据进行严格的分层(有兴趣可以了解下数仓的分层架构)。我所在的系统将数据分为以下4层:

1 ODM:最原始的数据;

2 SDM:基于ODM做过数据修复、汇总的数据;

3 ADM:基于SDM生成的业务可直接用数据;

4 RDM:基于SDM、AMD生成的报表用数据。

数据汇总 没什么好说的

数据展示 没什么好说的

二 单个报表设计实例

了解完这些基础知识后,我们就可以应用他们的思路设计表。假设我们现在拥有三张ODM层的表:

预警账户表(WRAN_ACCT)

字段中文****字段英文****
预警编号(主键)WRAN_NO
创建时间CREATE_T
所属机构ORG_NO

预警账户流水表(WRAN_ORDER)

字段中文****字段英文****
预警编号WRAN_NO
流水号(主键)ORDER_ID
创建时间CREATE_T

预警账户流水触发规则表(WRAN_RULE)

字段中文****字段英文****
ID(主键)****ID****
预警编号WRAN_NO
流水号ORDER_ID
创建时间CREATE_T
规则编号RULE

业务场景: 每日实时接入行内交易流水,并经过多个规则决策,最终将决策出来的可疑账户需要记录表中,如果当日预警账户重复则只生成一条预警单,生成完成后,需要业务人员线下排查并记录排查结果。排查过程中,业务人员需要我们提供决策过程中的流水相关信息、触发规则相关信息,我们也将这些信息记录入库。

表介绍: 当一条业务数据接入系统后产生决策后,决策后数据包含了账户、流水、规则等。一条业务数据对应一条“预警账户流水表(WRAN_ORDER)”信息;一条业务数据触发的n条规则对应n条“预警账户流水触发规则表(WRAN_RULE)”信息;多条同账户的业务数据对应一条“预警账户表(WRAN_ACCT)”信息。

汇总目标:****

1,业务选择指定创建时间范围,统计此条件下每个机构的预警单数量。

2,业务选择指定创建时间范围,统计此条件下每个机构的预警账户去重数量。

解决方案:****

l 汇总目标:1

设计中间表:机构预警情况日表(RPT_ORG_WRAN_INFO_BYDAY)

字段中文****字段英文****
加工时间(精度到日)****ETL_DATE****
所属机构ORG_NO
预警单数ALL_NUM

 

数据汇总流程:

每日启动定时任务,根据SQL将数据量汇总到日表程度。优点就是面对千万数据表,只需要查询中间表,节约了大量查询时间。

 

l 汇总目标:2

设计中间表:机构预警情况日表(RPT_ORG_WRAN_INFO_BYDAY)

字段中文****字段英文****
加工时间(精度到日)****ETL_DATE****
所属机构ORG_NO
预警单数ALL_NUM
预警账户去重数ALL_ACCT_NUM

到这里的时候,大家会发现一个重要问题:当业务任务选择一天的时间范围时候,我们通过上表是可以实现;但是当业务选择多天的时候,我们是没办法对上表的ALL_ACCT_NUM做数据累积的。这个时候,我们要和业务深入沟通,看他们常用的报表多久看一次、如果多天账户去重与实际数量有些许偏差是否可以接受。

根据目前的项目经验,业务统计数据的频次是有规律的。在我所属的系统里,业务的统计基本是每个月月末。因此我们设计月表去应对这个情况,表如下:

机构预警情况月表(RPT_ORG_WRAN_INFO_BYMON)

字段中文****字段英文****
加工时间(精度到月)****ETL_DATE****
所属机构ORG_NO
预警单数ALL_NUM
预警账户去重数ALL_ACCT_NUM

而在平时时,如果发现业务统计的时间范围不适合月表统计,则转而变成实时统计。

上面只是对单表的报表设计,有什么不妥大家可以交流。后面会记录企业级的报表整体规划。