BIEE采用基于分析的过滤器实现复杂导航实例

浏览: 2617

今天又有网友问到,怎样在导航过程中实现如下效果:

 

现有如下源报表,月粒度

 

当点击红色方框中的值的时候导航到目标报表(天粒度),同时要求目标报表只呈现最近12个月的数据

 

 

举个例子,当我在源报表点击2010年10月的Revenue值时,导航到目标并呈现2009年10月到2010年10月每天的Revenue。

 

这需要怎么来做呢?

 

当我拿到这个问题的时候,我首先想到的是我传两个值到目标表就可以了,分别是“当前数据行所在月-12月”和“当前月”

例如当前月是2010年8月,那么我需要将2009年8月(2010年8月-12月)及2010年8月传递到目标报表,然后在目标报表上做区间滤即可。

 

但问题也随之而来,怎样将月向前推12月?怎样同时传两个值(注意是两个值,而不是两个参数)传递过去呢?

 

第一个问题本来很好解决,如果时间维表上有月序号的话,直接用序号-12就可以了。但是这位网友的时间维表并没有该字段,只有一个

“2010年10月”形式的月描述字段,所以增加了麻烦,怎么办呢?

我采用的办法是先将其转换为日期类型,然后在用日期计算函数向前推12个月即可。

公式如下:

TIMESTAMPADD(SQL_TSI_MONTH, -12, to_datetime(replace(replace('2010年10月','年','-'),'月',''),'yyyy-mm'))

注:此处的公式只是举例,并不适用于本实例,本实例的公式请查阅后文

OK,解决了第一个问题,下面让我们来解决第二个问题

 

众所周知,当我们在表上进行导航的时候,BIEE只能将该行的属性字段值传递到目标报表,也就是说,源报表只能提供一个值,如下图所示:

当我点击红框中的值时,BIEE只会将T02 Per Name Month传递到目标表,并对目标表的T02 Per Name Month字段做一个等值过滤(这里不考虑T05 Per Name Year,因为用不到)

 

既然只能传递2009 / 01这个值,那我们能不能通过这个值在别的地方来生成需要值,然后用到目标报表上呢?

 

答案是肯定的,BIEE给我们提供了一种特殊的过滤器,那就是基于分析的过滤器,如下图所示:

所谓基于分析的过滤器,也就是说该提示的值来自于另外分析中的值域,我们可以在分析中完成相关逻辑的计算,在将计算完之后的值提供给目标报表做为过滤的条件。

 

所以,我们可以新建一个分析,用于将月份向前推12个月,具体实现如下:

MIN字段就是用于完成向前推12个月的字段,其公式如下:

EVALUATE('to_char(add_months(to_date(%1,%2),-12),%2)' AS CHAR , "Time"."T02 Per Name Month", 'yyyy / mm')

注:为了方便,此处直接调用了Oracle数据库函数,请根据自身需求进行更改


MAX字段在本例中就等于"Time"."T02 Per Name Month",之所以列出来,是为了以后的拓展考虑

 

 

注意我们在"Time"."T02 Per Name Month"字段上加有is prompted的过滤器,该过滤器是用导航服务的,源报表的月份值会传到该过滤器,从而使用该分析

只返回对应月,并完成时间计算。

 

 

OK,接下来让我们将该分析和目标报表串起来,目标报表结构如下:

 

红框部分就是我们需要设置的重点,两个过滤器设置如下:

 

过滤器一:

过滤器二:

 

可以看到,在Saved Analysis里我们引用了前面定义的分析,由于基于分析的过滤器未提供介于运算符,故需要通过两个过滤器来组合实现大于等于 且 小于等于的功能。

 

 

 

OK,至此我们就已经将问题解决了,剩下来就需要到源报表中将导航指向目标报表了,具体步骤在此就不在提供了。

推荐 2
本文由 风在身后 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册