MDX Step by Step 讀書筆記(五) - Working with Expressions (MDX 表達式) - CurrentMember - Properties - Existing 的使用


Current Member  當前成員

在計算成員中會經常用到獲取當前對象的函數, 可以這樣來訪問 [Dimension].[Hierarchy].CurrentMember

但是要注意這個函數返回的僅僅是一個成員的引用,一般要通過訪問成員的某些屬性來獲取一些具體的值。

    

示例一 - 訪問當前成員和父成員

WITH MEMBER [Measures].[Current Member Name] AS
    [Product].[Product Categories].CurrentMember.Name MEMBER [Measures].[Parent Member Name] AS
    [Product].[Product Categories].CurrentMember.Parent.Name MEMBER [Measures].[Current Member Name NULL] AS
    [Product].[Product Categories].CurrentMember MEMBER [Measures].[Parent Member Name NULL] AS
    [Product].[Product Categories].CurrentMember.Parent SELECT { ([Measures].[Current Member Name]), ([Measures].[Parent Member Name]), ([Measures].[Current Member Name NULL]), ([Measures].[Parent Member Name NULL]) } ON COLUMNS, {[Product].[Product Categories].AllMembers} ON ROWS FROM [Step-by-Step]

查詢結果

最后兩列的值都是為 NULL, 是因為無論是 CurrentMember 還是 CurrentMember.Parent 返回的只是一個引用,要得到具體的值就應該在引用的時候加上一些屬性。

CurrentMember 返回的是當前的成員

CurrentMember.Parent 返回的是當前成員的父成員引用

在這個例子中可以看到這些成員的父成員,除了 All Products 外,因為對於 All Products 來說它沒有父成員,所以顯示為 null。

 

MEMBER.Properties 函數的使用

Properties 可以幫助通過名稱返回一個成員固有的或者用戶自定義的屬性內容。一般情況下是以字符串形式返回,除了指定了 TYPED 關鍵字,那么將按照這個屬性本身的數據類型來返回數據。

member.Properties( Name [, TYPED] )

下面列表中列出了 SSAS 自帶的成員屬性 

示例二 使用 Properties

WITH MEMBER [Measures].[Parent Member Name] AS
[Product].[Product Categories].CurrentMember.Properties("LEVEL_NUMBER") SELECT {([Measures].[Parent Member Name])} ON COLUMNS, {[Product].[Product Categories].AllMembers} ON ROWS FROM [Step-by-Step];

按照之前的圖例解釋 LEVEL_NUMBER 返回的是這個成員在屬性層次結構中的位置,根成員的Level 為0。

查詢結果 –

示例三  使用 IIF 條件語句

使用IIF 表達式很簡單,和我們在其它變成語言中學習的 if 條件語句使用相同

下面示例查詢所有的 Product 成員並顯示它們的父成員,由於根Level的成員沒有父成員,因此根成員的父成員將被顯示為 “Not Applicable”

WITH MEMBER [Measures].[Parent Member Name] AS IIF( [Product].[Product Categories].CurrentMember.Properties("Level_Number",TYPED)=0, "Not Applicable", [Product].[Product Categories].CurrentMember.Parent.Name ) SELECT {([Measures].[Parent Member Name])} ON COLUMNS, {[Product].[Product Categories].AllMembers} ON ROWS FROM [Step-by-Step];

查詢結果

示例四 繼續使用 IIF 條件 

WITH MEMBER [Measures].[Parent Member Name] AS IIF( [Product].[Product Categories].CurrentMember.Properties("Level_Number",TYPED)=0,    "Not Applicable",    [Product].[Product Categories].CurrentMember.Parent.Name ) MEMBER [Measures].[Percent of Parent] AS   ([Measures].[Reseller Sales Amount])/   ([Product].[Product Categories].CurrentMember.Parent, [Measures].[Reseller Sales Amount])   ,FORMAT_STRING="Percent" SELECT { ([Measures].[Parent Member Name]), ([Measures].[Reseller Sales Amount]), ([Measures].[Percent of Parent]) } ON COLUMNS, {[Product].[Product Categories].AllMembers} ON ROWS FROM [Step-by-Step];

第一點要注意的是如何引用一個父類成員 [Product].[Product Categories].CurrentMember.Parent

而不是之前的例子中[Product].[Product Categories].CurrentMember.Parent.Name, 請一定分清父成員和父成員屬性的區別。

第二點當父成員為 NULL 的時候,整個元組 ([Product].[Product Categories].CurrentMember.Parent, [Measures].[Reseller Sales Amount])也為NULL,但是在除法運算中將被替換為0 ,分母為0,運算出錯。但是注意,這里的 NULL 分為兩種情況,一種是真正的NULL,不存在這個值轉換為0;一種是因為沒有值顯示為NULL,那么最后計算的結果也顯示為 NULL。

加上對父成員級別的判斷

WITH MEMBER [Measures].[Parent Member Name] AS IIF( [Product].[Product Categories].CurrentMember.Properties("Level_Number",TYPED)=0, "Not Applicable", [Product].[Product Categories].CurrentMember.Parent.Name ) MEMBER [Measures].[Percent of Parent] AS IIF( [Product].[Product Categories].CurrentMember.Properties("Level_Number",TYPED)=0, "Not Applicable", ([Measures].[Reseller Sales Amount])/ ([Product].[Product Categories].CurrentMember.Parent, [Measures].[Reseller Sales Amount]) ) ,FORMAT_STRING="Percent" SELECT { ([Measures].[Parent Member Name]), ([Measures].[Reseller Sales Amount]), ([Measures].[Percent of Parent]) } ON COLUMNS, {[Product].[Product Categories].AllMembers} ON ROWS FROM [Step-by-Step]

查詢結果

除了 CurrentMember 以外,Analysis Services 還支持其它的一些行數來訪問一些比較特別的成員。

[Dimension].[Hierarchy].DefaultMember [Dimension].[Hierarchy].UnknownMember [Dimension].[Hierarchy].DataMember

DefaultMember 函數返回一個給定層次結構的默認成員。如果沒有定義默認成員,那么就返回All這個成員,如果沒有All這個成員,就返回層次結構中第一個成員。

UnknownMember 函數返回指定的層次結構中未知的成員。如果不存在這種 unknown 成員,那么就返回 null。但是在度量值層次結構中使用 UnknownMember,就返回一個 error,因為在度量值層次結構中不應該存在 unknown 成員這種概念。 

DataMember 返回系統生成的數據成員,它與某個維度的非葉成員相關聯。

 

在表達式中使用 SET 集合

在表達式中使用 SET 集合要注意,SET 集合不會被當前單元格的上下文所影響。這樣一來,Auto-Exists 機制就無法應用,先來看一個例子。

WITH MEMBER [Measures].[Number of Products] AS
COUNT( [Product].[Product].[Product].Members ) SELECT { ([Measures].[Reseller Sales Amount]), ([Measures].[Number of Products]) } ON COLUMNS, {[Product].[Category].Members} ON ROWS FROM [Step-by-Step]

查詢結果

 

按照我們之前的理解, 在計算 Category 下面有多少個Products時,Auto-Exists 會自動歸類匹配,但是實際上 Products 集合在計算成員總數的時候並沒有關聯到計算成員中的Tuple的上下文環境,因此算出來的總數就是實際所有 Product的總數 397。

使用 Existing 關鍵字可以強制在計算成員表達式中的 SET 使用當前上下文環境。

WITH MEMBER [Measures].[Number of Products] AS
COUNT( EXISTING [Product].[Product].[Product].Members ) SELECT { ([Measures].[Reseller Sales Amount]), ([Measures].[Number of Products]) } ON COLUMNS, {[Product].[Category].Members} ON ROWS FROM [Step-by-Step];

可以這樣理解,在依次與 Product.Category 層次結構下的各個成員交匯的時候,那么這些成員就限定了計算成員中 Products 統計成員個數的空間。

比如說,當前讀取的 Category 成員是Bikes,那么在應用了 Existing 關鍵字后,可以認為所有的關於 Products 下的 Members 的統計實際上都限定在了 Bikes 這個大類下面來進行了,Bikes 就是它們的上下文環境,其實這就是 Auto-Exists 的作用。

更多 BI 文章請參看 BI 系列隨筆列表 (SSIS, SSRS, SSAS, MDX, SQL Server)  如果覺得這篇文章看了對您有幫助,請幫助推薦,以方便他人在 BIWORK 博客推薦欄中快速看到這些文章。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM