今天又有网友问到,怎样在导航过程中实现如下效果:
现有如下源报表,月粒度
当点击红色方框中的值的时候导航到目标报表(天粒度),同时要求目标报表只呈现最近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,至此我们就已经将问题解决了,剩下来就需要到源报表中将导航指向目标报表了,具体步骤在此就不在提供了。