《如何实现报表数据的动态层次钻取(一)》 介绍了利用复杂 sql 实现动态层次结构的方法,但该方法依赖 Oracle 的递归语法,在其他类型的数据库中难以实现。要想通用地实现此类报表,可以使用下面介绍的“集算脚本 + 本地文件”的方法。
创新互联主营虹口网站建设的网络公司,主营网站建设方案,重庆APP开发公司,虹口h5微信小程序开发搭建,虹口网站营销推广欢迎虹口等地区企业咨询《各级部门 KPI 报表》的格式和具体要求参见上一篇文章。有所不同的是,报表数据源从数据库表变为本地文件:tree.b(树形结构维表)和 kpi.b(指标事实表),数据示例如下图:
Tree 文件数据
Kpi 文件数据
说明:Tree 的叶子节点,通过 id 字段与 kpi 表关联。KPI 文件每个 ID 每天都会新增 kpi 记录,总数据量较大。
具体实现步骤如下:
第一步 编写集算脚本 tree.dfx,完成源数据计算,输入参数为当前节点号 id。
集算脚本如下:
A | B | C | |
---|---|---|---|
1 | =[“省”,“地市”,“区县”,“营业部”]|to(4,13).(“架构”+string(~)) | =file(“D:\\files\\tree.b”).import@b() | =file(“D:\\files\\kpi.b”).cursor@b() |
2 | =B1.switch(PID,B1:ID) | =B1.select@1(ID==string(id)) | =B2.prior(PID).rvs() |
3 | =C2.new(ID,NAME,A1.m(#):title) | >xtitle=A1.m(A3.len()+1) | =B1.select(PID==B2) |
4 | =if(C3.len()>0,C3,B1.create().insert(0)) | =B1.new(ID, ~.prior( PID, B2):GID ).select( GID) | =B4.run(GID=GID.m(-1).ID ) |
5 | =C1.switch@i(ID,C4:ID) | =A5.groups(ID.GID:ID;sum(KPI1):KPI1,sum(KPI2):KPI2,sum(VIPKPI1):VIPKPI1,sum(VIPKPI1):VIPKPI2) | =B5.align(A4:ID,ID) |
6 | =C5.new(A4(#).ID:ID,A4(#).NAME:NAME,xtitle:TITLE,KPI1:KPI1,KPI2:KPI2,VIPKPI1:VIPKPI1,VIPKPI2:VIPKPI2) | return A3,A6 |