Saiku关于过滤的使用(九)

Saiku查询设定:Saiku查询数据时,每次都是全量查询的,我们现在需要默认展示近一周的数据。

 

通过编写使用MDX表达式进行过滤

通过编写MDX表达式,添加新的指标信息对一周以内的数据进行标识 (其实我也想添加新的维度信息,但是好像不生效,所以就用指标了)

/** 检测日期的差值,小于7 */
IIf(DateDiff("d",CDate([SaikuUseDate].[SaikuUseDate].CurrentMember.Name), now())> 7, "yes", "no") 

/** 检测日期差值大于0并且小于7 (显示最近一周的数据) 但是其他年份的相同月份的数据也会显示出来*/
IIF(datediff("y",cdate(now()),cdate([SaikuUseDate].[SaikuUseDate].CurrentMember.Name))<=7,
IIF(datediff("y",cdate(now()),cdate([SaikuUseDate].[SaikuUseDate].CurrentMember.Name))>=0,"週數據","非週數據"),"非週數據")

//处理不同年份的日期差值问题(固定年份差值为0,表示只判定当年的数据) year(now()) 取的值为2019
IIF(datediff("y",cdate(now()),cdate([SaikuUseDate].[SaikuUseDate].CurrentMember.Name))<=7,
IIF(datediff("y",cdate(now()),cdate([SaikuUseDate].[SaikuUseDate].CurrentMember.Name))>=0,
IIF( year(cdate(now())) - year(cdate([SaikuUseDate].[SaikuUseDate].CurrentMember.Name))=0,"週數據","非週數據"),"非週數據"),"非週數據")

 

其中SaikuUseDate是我自定义的日期维度信息,在schame中的定义如下:

    <Dimension name="SaikuUseDate"  foreignKey="ID" >
            <Hierarchy hasAll="true" primaryKey="ID" allMemberName="SaikuUseDate">
              <Level name="SaikuUseDate" column="saikuUseDate" type='Date'  uniqueMembers="false" />
            </Hierarchy>
        </Dimension>

  

区分最近一周数据与其他数据最终的MDX表达式语句为:

IIF(datediff("y",cdate(now()),cdate([SaikuUseDate].[SaikuUseDate].CurrentMember.Name))<=7,
  IIF(datediff("y",cdate(now()),cdate([SaikuUseDate].[SaikuUseDate].CurrentMember.Name))>=0,
    IIF( year(cdate(now())) - year(cdate([SaikuUseDate].[SaikuUseDate].CurrentMember.Name))=0,"週數據","非週數據"),
  "非週數據"),
"非週數據")

 

saiku中添加新的指标信息如下:

 Saiku关于过滤的使用(九)

 

根据新指标信息查询结果如下:

Saiku关于过滤的使用(九)

 

数据已筛选好了,接下来只需要把 新指标  週數據 字段按照 週數據 與 非週數據 进行筛选就可以啦。

(目前因为saiku是社区版的,过滤不起作用所以没法演示了,后期如果解决了过滤问题会更新的)

 

=============更新关于过滤===================终于把过滤问题处理好了============== start

>>>>>>首先我们学习一下MDX语句进行数据过滤:

1.登录saiku,选中指定cube

2. 选择上方的工具栏中的 MDX模式  (表示根据MDX语句查询数据,直接将MDX语句写好然后点击 执行按钮 去执行就可以了【有个问题就是好像MDX模式无法切换到普通的拖拽模式】)

3. MDX表达式语句如下: (目的:根据日期筛选出近一周的数据)

语句1:

WITH
MEMBER [Measures].[周数据筛选] AS
  IIF(datediff("y",cdate(now()),cdate([SaikuUseDate].[SaikuUseDate].CurrentMember.Name))<=7 
  AND datediff("y",cdate(now()),cdate([SaikuUseDate].[SaikuUseDate].CurrentMember.Name))>=0 
  AND year(cdate(now())) - year(cdate([SaikuUseDate].[SaikuUseDate].CurrentMember.Name))=0,"週數據","非週數據")

SET [~ROWS] AS {FILTER([SaikuUseDate].[SaikuUseDate].[SaikuUseDate].Members,[Measures].[周数据筛选]="週數據")}
SELECT
NON EMPTY {[Measures].[周数据筛选], [Measures].[daycount]} ON COLUMNS,
NON EMPTY [~ROWS] ON ROWS
FROM [rs_nbjc_1_1]

或使用如下MDX表达式进行过滤(这两条语句的结果一样,但是第二条语句将过滤表达式作为条件放入where后面,使得查询的效率提高  推荐使用语句2

语句2:

WITH
SET [~filterByDate] AS
	 Filter({[SaikuUseDate].[SaikuUseDate].[SaikuUseDate].Members}, 
		Instr(IIF(datediff("y",cdate(now()),cdate([SaikuUseDate].[SaikuUseDate].CurrentMember.Name))<=7 AND 
		  datediff("y",cdate(now()),cdate([SaikuUseDate].[SaikuUseDate].CurrentMember.Name))>=0 AND 
		  year(cdate(now())) - year(cdate([SaikuUseDate].[SaikuUseDate].CurrentMember.Name))=0,"yes","no"),"yes") > 0)

SET [~ROWS] AS {[countdate].[countdate].[countdate].Members}
SELECT
NON EMPTY { [Measures].[daycount]} ON COLUMNS,
NON EMPTY [~ROWS] ON ROWS
FROM [rs_nbjc_1_1]
where [~filterByDate]

 

schame文件中 cube名为  rs_nbjc_1_1  的设计如下:

<!-- rs_nbjc_1_1 用來做MDX FILTER表達式的測試 -->
    <Cube name="rs_nbjc_1_1">
         
	<Table name="rs_nbjc_1_1" />
      <Dimension name="SEQID" foreignKey="ID" >
        <Hierarchy hasAll="true" primaryKey="ID" allMemberName="SEQID" >
          <Level name="SEQID" column="ID" uniqueMembers="true" type="String" />
        </Hierarchy>
      </Dimension>

	
	<Dimension name="countdate"  foreignKey="ID" >
            <Hierarchy hasAll="true" primaryKey="ID" allMemberName="countdate">
              <Level name="countdate" column="countdate" type='Date'  uniqueMembers="false"  />
            </Hierarchy>
        </Dimension>
		
	<Dimension name="SaikuUseDate"  foreignKey="ID" >
            <Hierarchy hasAll="true" primaryKey="ID" allMemberName="SaikuUseDate">
              <Level name="SaikuUseDate" column="saikuUseDate" type='Date'  uniqueMembers="false" />
            </Hierarchy>
        </Dimension>
		
        <Measure name="daycount" column="daycount"  aggregator="sum" />
         
    </Cube>

  

>>>>>>使用SAIKU的MDX表达式过滤

1. 过滤的使用与日常拖拉数据一样,但是记得将需要过滤的字段放入过滤栏位

Saiku关于过滤的使用(九)

2. 在过滤这个位置 左击鼠标,然后依次选中 过滤  >>>  Custom

Saiku关于过滤的使用(九)

3.进入编写MDX过滤表达式弹窗

Saiku关于过滤的使用(九)

 过滤表达式内容如下:

Instr(
IIF(datediff("y",cdate(now()),cdate([countdate].[countdate].CurrentMember.Name))<=7 
AND datediff("y",cdate(now()),cdate([countdate].[countdate].CurrentMember.Name))>=0 
AND year(cdate(now())) - year(cdate([countdate].[countdate].CurrentMember.Name))=0,"yes","no"),"yes")>0

4. 点击ok后,如果取消了自动查询就手动点击一下查询按钮,执行查询后可看到如下结果:(结果数据以及被过滤,取的是近一周的数据,当前日期为 2019-02-28)

Saiku关于过滤的使用(九)

 =============更新关于过滤===================终于把过滤问题处理好了============== end

ps: 使用过滤表达式后,记得先取消saiku的自动执行哦,然后将用到的数据信息都拖拽好,过滤信息也编写好,最后在手动点击执行!!!(不然每拖拽一次都要执行一遍,很比较浪费内存哦。)

上一篇:XML中CDATE


下一篇:MySQL实现按天分组统计,提供完整日期列表,无数据自动补0