加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

BI最佳实践:BIRT直方图模型分解

发布时间:2020-12-14 04:05:53 所属栏目:大数据 来源:网络整理
导读:直方图是一种最普通也最易懂的报表模型,但这种模型会受页面宽度限制,比如X轴的系列值过多,无法在一排完全显示出来,有人会想到将X、Y轴做翻转,但这又太难看了,另外也有可能翻转后在一页里仍然显示不完,这时客户一般会想到,将一个图表放不下的数据折行
直方图是一种最普通也最易懂的报表模型,但这种模型会受页面宽度限制,比如X轴的系列值过多,无法在一排完全显示出来,有人会想到将X、Y轴做翻转,但这又太难看了,另外也有可能翻转后在一页里仍然显示不完,这时客户一般会想到,将一个图表放不下的数据折行显示,这样一直纵向地连续铺展下去,笔者当初只是有这样一个想解决这类问题的想法,晚上跳舞回来没事动手就实现了,我先把效果图贴上(注意我只设计一个直方图,并不是三个):

实现步骤如下(实验的业务模型是ORACLE里SCOTT模式的EMP员工表):
1、先把业务数据做一个分页数据集(1),即把已分组的数据进行分段,因为做过WEB或数据库开发的人都知道分页算法的原理,我就不赘述了(不了解的直接谷歌或SO.COM吧),将分段起点和终点设置成参数
附代码:
select rn,deptname,total_emps
??from (select t.*,rownum rn
? ?? ?? ? from (select deptno,count(*) total_emps
? ?? ?? ?? ?? ?? ?from SCOTT.S_EMP
? ?? ?? ?? ?? ???group by deptno,deptname
? ?? ?? ?? ?? ???order by deptno) t
? ?? ?? ?order by rn)
where rn between ? and ?
2、虚拟一个层级查询的数据集(2),这个查询的最大值是:最终你要折几次行完全显示的行数,比如每行放10个系列值,总共是100个系列组,那这个层级数据集的内容将是1,2,3……10;通过这个数据集你可能计算出(1)中的数据集分段起点和终点值,可做为另外两列假设为:N1和N2,比如第一段的起点、终点为1和10,第二段为11和20……,第10段为99和100
select level n,10 * (level - 1) + 1 n1,10 * level n2
??from dual
connect by level <= (select ceil(count(distinct deptno) / 10) from s_emp)
3、插入一个表格,和数据集(2)绑定,再在明细里插入直方图,数据来源为数据集(1)
4、这时候因为数据集(1)是含参的,所以将分段起点和终点参数与数据集(2)的N1和N2对接,至此就基本完成了。
注意事项:
1、因为用到虚拟的层级查询数据集,所以数据库一定要支持层级查询,我很熟悉的ORACLE和POSTGRESQL均支持
2、数据集(1)查询里的排序应该和图表里系列值排序一致,这样防止分段错乱
总结:

这里用到的核心算法其实非常简单,一个简单的分页原理加上一个层级虚拟查询,但将二者在BIRT中结合便产生了一个BI的最佳实践,供大家参考。


birt用脚本javascript创建数据源,并从配置文件中读数据库信息

可以用script往解决第一个题目。 可以定义一个参数往指定properties文件的路径,然后创建datasource。 在datasource的script中编辑beforeOpen事件,参考下面的代码: ======================================= importPackage( Packages.java.io ); importPackage( Packages.java.util ); fin = new java.io.FileInputStream( new String(params["propFile"]) ); props = new java.util.Properties( ); props.load(fin); extensionProperties.odaURL = new String(props.getProperty("url")); extensionProperties.odaDriverClass = new String(props.getProperty("driver")); extensionProperties.odaUser = new String(props.getProperty("userid")); extensionProperties.odaPassword = new String(props.getProperty("password")); fin.close(); 这样就可以从properties文件中动态读取数据源配置信息。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读