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 博客推薦欄中快速看到這些文章。