MDX語法學習(一)filter與iif的使用

當咱們建好 立方體以後,就可使用 MDX語法大展拳腳,下面咱們以一個簡單的例子逐步展開
先介紹一下咱們的立方體,經過這個例子來學習filter與iif的使用。
咱們首先談需求
 
需求一:獲得 2009 5 月,產品 BM00000001 的各城市年累計處方量
需求分析:
度量值:年累計處方量 [Year_Pres_Quantity]
維度: [cust].[City_Name].[City_Name]
條件: [ 月份 ].&[2009-05-01T00:00:00] [material].[Material].&[BM00000001]
所以,構造咱們的 MDX 以下:
    select [Measures] . [Year_Pres_Quantity] on 0
        ,non empty [cust].[City_Name].[City_Name] on 1
    from [ 醫院銷售分析 ]
    WHERE ([ 月份 ] .& [2009-05-01T00:00:00]
, [material] . [Material] .& [BM00000001])
 
需求二:獲得 2009 5 月,產品 BM00000001 的各城市 目標醫生 的年累計處方量
注意:這裏多了一個要求,必須是目標醫生的
在咱們的傳統 SQL 中,這是很容易實現的,咱們在 where 中增長一個 where 是否目標醫生 =true
便可
可是,在 MDX 中, where 後面只能接維度,是否目標醫生並非咱們的維度
那麼,怎麼辦呢?
輪到 filter 上場了
構造咱們的 MDX 以下:
    select ([Measures].[Year_Pres_Quantity]) on 0
        ,non empty filter([cust].[City_Name].[City_Name]
, [Measures] . [ 是否目標醫生 ] = true )  on 1
    from [ 醫院銷售分析 ]
    WHERE ([ 月份 ] .& [2009-05-01T00:00:00]
, [material] . [Material] .& [BM00000001] )
需求三:獲得 2009 5 月,產品 BM00000001 的各城市 目標醫生和非目標醫生各自 的年累計處方量
在咱們的傳統 SQL 中,這種需求能夠經過 case when 來實現,那麼在 MDX 裏有沒有相似的東西呢?
固然有,輪到 iif 上場了
構造咱們的 MDX 以下:
WITH
MEMBER [ 目標醫生年累計處方量 ] AS 'IIf([Measures].[ 是否目標醫生 ]=false, [Measures].[Year_Pres_Quantity],null)'
MEMBER [ 非目標醫生年累計處方量 ] AS 'IIf([Measures].[ 是否目標醫生 ]=true, [Measures].[Year_Pres_Quantity],null)'
 
    select {[ 目標醫生年累計處方量 ] , [ 非目標醫生年累計處方量 ] } on 0
       ,non empty [cust].[City_Name].[City_Name] on 1
       from [ 醫院銷售分析 ]
       WHERE ([ 月份 ] .& [2009-05-01T00:00:00]
, [material] . [Material] .& [BM00000001] )
 
其實,我還試圖過直接寫在 MDX select 中,不過不行,會報錯,緣由,我還搞不清楚,有哪位大蝦明白的話,不凡指點一二,難道是切片技術不能直接寫在 Select 中?
    select (IIf([Measures].[ 是否目標醫生 ] = false , [Measures].[Year_Pres_Quantity],)
       ,IIf([Measures].[ 是否目標醫生 ] = true , [Measures].[Year_Pres_Quantity],)) on 0
       ,non empty [cust].[City_Name].[City_Name]
        on 1
       from [ 醫院銷售分析 ]
       WHERE ([ 月份 ] .& [2009-05-01T00:00:00] , [material] . [Material] .& [BM00000001] )
      
出錯: Axis0 函數須要 2 參數使用一個元組集表達式。實際使用的倒是字符串或數值表達式。
 
需求四:獲得 2009 5 月,產品 BM00000001 的各城市 目標醫生和非目標醫生各自 的年累計處方量,而且要獲得總計欄
粗一看,這個需求和需求三沒啥區分,不就是要獲得總計嗎,數據倉庫裏獲得總計很容易哪,用merber就能夠了,咱們來寫寫
WITH
MEMBER [ 目標醫生年累計處方量 ] AS 'IIf([Measures].[ 是否目標醫生 ]=false, [Measures].[Year_Pres_Quantity],null)'
MEMBER [ 非目標醫生年累計處方量 ] AS 'IIf([Measures].[ 是否目標醫生 ]=true, [Measures].[Year_Pres_Quantity],null)'
 
    select {[ 目標醫生年累計處方量 ] , [ 非目標醫生年累計處方量 ] } on 0
       ,non empty [cust].[City_Name].merber   on 1
       from [ 醫院銷售分析 ]
       WHERE ([ 月份 ] .& [2009-05-01T00:00:00]
, [material] . [Material] .& [BM00000001] )
 
看看,把 [cust] . [City_Name] . [City_Name] 改成 [cust] . [City_Name] . merber
總計就出現啦!是否是大功告成了呢?
別急,仔細看看,咦,爲何 目標醫生和非目標醫生 下的小計值都是同樣的?
哎,這就是數據倉庫的特點哪
任何一個東西都不是十全十美的
數據倉庫,他的速度之因此這麼快,是由於他用立方體把不少數據都事先存好了,這樣,你要總計,他就能直接給你找出來,不須要二次計算,但是,若是你要 iif 以後的小計,他就無能爲力了,由於他沒有存這樣的數據哪!
 

MDX語法學習(一)filter與iif的使用就到這裏了,IIF看來只能用在不須要小計、總計的地方,那若是又必需要小計,怎麼辦呢,你們琢磨琢磨,偶們MDX語法學習(二)再揭密!函數

相關文章
相關標籤/搜索