1. 程式人生 > >【轉載】MDX Step by Step 讀書筆記(三) - Understanding Tuples (理解元組)

【轉載】MDX Step by Step 讀書筆記(三) - Understanding Tuples (理解元組)

將不 對比 處理 ren tuples 定位 用戶 結構 init

1. 在 Analysis Service 分析服務中,Cube (多維數據集) 是以一個多維數據空間來呈現的。在Cube 中,每一個緯度的屬性層次結構都形成了一個軸。沿著這個軸,在屬性層次結構上的每一個成員包括 “ALL” 成員都在軸上占了一個點。

2. 包含度量值的緯度叫做事實緯度或者度量緯度,度量屬性層次結構和其它屬性層次結構的區別就是度量屬性層次結構沒有 ALL 這個成員。

3. 成員的引用 – 引用屬性層次結構中的成員有很多方式,但基本的成員引用可以通過與它相關聯的緯度和屬性層次結構來實現: [Dimension].[Hierarchy].[Member]。

4. 理解這幅圖

技術分享圖片

在 Product 緯度中有兩個屬性層次結構 – Category 和 Subcategory,在Date 緯度中也有兩個屬性層次結構 – Calendar Year 和 Fiscal Year,這兩個屬性層次結構在一起構成了一個用戶自定義的層次結構 – Calendar-To-Fiscal Year。這四個原始的屬性層次結構再加上度量值屬性層次結構,在Cube 空間裏總共有5個軸,那麽在這個緯度空間裏的點因此需要用5個元素組成的元組來定位。

5. 通過使用元組可以定位到Cube 空間中的一個點。但是在這個點上,它是以一個簡單的值來顯示的,這個點可以理解為 Cell – 單元格。Cell 其實是一個對象,它有很多不同的屬性。當訪問這個單元格時,各種不同的屬性會隨之返回。默認返回的屬性有 VALUE 和 FORMATTED_VALUE。

6. VALUE 屬性包含了聚合的度量值,這個值是在與這個單元格相關聯的其它屬性層次結構上聚合的度量值。

7. FORMATTED_VALUE 屬性包含了以字符串形式呈現的VALUE,這種格式化在設計階段就已經確定了,它只是用來控制最終在MDX 查詢界面顯示的格式, 可以通過查看 CELL PROPERTIES 來了解VALUE 和FORMATTED_VALUE。

技術分享圖片

CellOrdinal 屬性表示的是在查詢返回的集合中的位置。

8. 可以添加 CELL PROPERTIES 關鍵字,但這樣的話就需要顯示定義出 VALUE 和 FORMATTED_VALUE,否則這兩個屬性將不會被返回。

下面查詢的內容將返回其它的單元格屬性 FORMATTED_VALUE和 FORMAT_STRING

SELECT  FROM [Chapter 3 Cube]  
WHERE (      
[Product].[Subcategory].[Mountain Bikes],      
[Date].[Calendar Year].[All Periods],      
[Date].[Fiscal Year].[All Periods],      
[Product].[Category].[Bikes],      
[Measures].[Measures].[Reseller Sales Amount]        
) CELL PROPERTIES FORMATTED_VALUE, FORMAT_STRING
技術分享圖片

返回的單元格屬性就沒有 VALUE 和 FORMATTED_VALUE 了。

9. 局部元組(Partial Tuple) – 對比元組 Tuple而言,在局部元組中有一個或者多個成員的引用被忽略掉了,沒有顯式的寫出來。一個完整的元組可以定位到Cube空間的一個點,Analysis Services 在處理局部元組的時候將會按照一定的規則去自動的填充在局部元組中被忽略掉的成員引用: 1. 如果成員引用被忽略,將使用屬性的默認成員(即這個屬性的默認值) 2. 如果成員引用被忽略並且這個成員沒有默認值,那麽將使用這個屬性的 All 成員。 3. 如果成員引用被忽略,成員沒有默認值也沒有All 這個成員,那麽就使用這個屬性的第一個成員(這個屬性下所有值集合中的第一個值)。

10. 局部元組的使用 – 當元組中缺少度量值屬性成員的引用時

SELECT  FROM [Chapter 3 Cube]  
WHERE (                  
[Date].[Calendar Year].[All Periods],                  
[Date].[Fiscal Year].[All Periods],                  
[Product].[Category].[Bikes],                  
[Product].[Subcategory].[Mountain Bikes],                  
[Measures].[Measures].[Reseller Sales Amount]        
)

查詢結果是 - $26,492,684.38

這個元組中包含5個軸,其中Date 緯度上引用的都是屬性層次結構中的 ALL 成員,其含義為查詢 Bikes 大類下的Mountain Bikes 所有的零售額。All 成員就是表示所有年份,不考慮具體時間點或時間段的零售額,只考慮總銷售額,但也明確了是在 Bikes 大類 和 Mountain Bikes 子類範圍。

現在在這個完整的元組中去掉一個成員引用 –

SELECT  FROM [Chapter 3 Cube]  
WHERE (                    
[Date].[Calendar Year].[All Periods],                    
[Date].[Fiscal Year].[All Periods],                    
[Product].[Category].[Bikes],                    
[Product].[Subcategory].[Mountain Bikes]        )

查詢結果仍然相同 - $26,492,684.38 結果相同。

技術分享圖片

此圖中 Analysis Services 首先檢查各個軸,也就是緯度有沒有缺失。根據上面的代碼能夠檢查到對於度量值屬性層次結構這個軸右缺失,於是第一步先檢查這個屬性有沒有默認的成員。通過檢查發現這個屬性默認的成員引用就是 Reseller Sales Amount, 因此就會自動將對這個成員的引用補充到這個元組中使其變成一個完整的Tuple 元組,這樣再集合其它的成員引用來定位到Cube空間的某一個點。

度量值屬性層次結構中的默認成員是在設計階段定下的,因為度量值屬性層次結構沒有ALL這個成員,所有如果度量值屬性層次結構中沒有指定默認成員的話,那麽第一個度量值成員將被填充到元組中。

11. 局部元組 – 當元組中缺少屬性層次結構的引用時

SELECT  FROM [Chapter 3 Cube] 
 WHERE (        
[Product].[Category].[Bikes],        
[Product].[Subcategory].[Mountain Bikes]        
)

結果 - $26,492,684.38

技術分享圖片

5個軸,其中 Date兩個軸再加上度量值這個軸總共3個軸沒有對應的點,即在Cube 這個空間裏缺少3個軸的坐標引用,無法定位到空間的具體某一點。對於度量值成員的引用直接按照第一種規則使用默認成員引用填充,但是Date緯度上的Calendar Year和Fiscal Year 這兩個屬性層次結構(即軸)並沒有指定默認成員,因此將使用第二規則使用All成員。

因此等同於 -

SELECT F ROM [Chapter 3 Cube]  
WHERE (                    
[Date].[Calendar Year].[All Periods],                    
[Date].[Fiscal Year].[All Periods],                    
[Product].[Category].[Bikes],                    
[Product].[Subcategory].[Mountain Bikes],                    
[Measures].[Measures].[Reseller Sales Amount]      
)   

12. 用戶自定義的屬性層次結構 Calendar-To-Fiscal Year 是一個用戶自定義的屬性層次結構,如果要引用Calendar Year 2003 這個成員的話可以這麽引用 –

[Dimension].[Hierarchy].[Member]

[Date].[Calendar-To-Fiscal Year].[CY 2003]

用戶自定義的屬性層次結構實際上也是來源於其它屬性層次結構,所以它們的成員標識符很有可能並不是唯一的。

比如這樣引用 [Date].[Calendar-To-Fiscal Year].&[2003],問題在於不清楚這裏的Key 2003 是指Calendar Year 2003 還是指 Fiscal Year 2003。

技術分享圖片

因此此時需要一個Level來區分:

[Dimension].[Hierarchy].[Level].[Member]

[Date].[Calendar-To-Fiscal Year].[Calendar Year].$[2003]

但是盡管如此也會出現其它的問題,例如在用戶自定義的屬性層次結構中存在兩個相同的FY2004 成員,這時需要加上它們的Parent 節點 -   [Date].[Calendar-To-Fiscal Year].[Calendar Year].[CY 2002].[FY 2003] [Date].[Calendar-To-Fiscal Year].[Calendar Year].[CY 2003].[FY 2003]

13. 理解用戶自定義層次結構 User-Hierarchies

用戶自定義層次結構上的成員實際最終引用的還是其它屬性層次結構上的成員。

SELECT  FROM [Chapter 3 Cube]  
WHERE (        
[Date].[Calendar-To-Fiscal Year].[Calendar Year].[CY 2003].[FY 2003]      
)

Analysis Services 首先在用戶自定義層次結構中定位到在 Fiscal Year level 上的成員 FY 2003 以及與之相關聯的 Calendar Year 上的 CY 2003成員,再各自定位到屬性層次結構軸上的成員引用,這個結果和這裏的查詢結果是一樣的,因為它們有相同的引用。

技術分享圖片

SELECT  FROM [Chapter 3 Cube]  
WHERE (        
[Date].[Calendar Year].[CY 2003],        
[Date].[Fiscal Year].[FY 2003]        )  

14. 當用戶自定義層次結構和屬性層次結構在同一個軸上引用同一個成員時

SELECT  FROM [Chapter 3 Cube]  
WHERE (        
[Date].[Calendar-To-Fiscal Year].[Calendar Year].[CY 2002].[FY 2003],        [
Date].[Fiscal Year].[FY 2003]        )

技術分享圖片

不會發生沖突,因為在一條軸上定位的都是同一個點。

15. 當用戶層次結構和屬性層次結構在同一個軸上引用不同成員時

技術分享圖片

SELECT  FROM [Chapter 3 Cube]  
WHERE (        
[Date].[Calendar-To-Fiscal Year].[Calendar Year].[CY 2002].[FY 2003],        
[Date].[Fiscal Year].[FY 2002]        ) 

發生沖突,返回NULL,原因就在於 Analysis Service 不能確定在 Fiscal Year上到底要引用哪一個成員。

16. 如何通過Name引用一個成員 – [Dimension].[Hierarchy].[Member Name]

示例-[Product].[Category].[Bikes]

17. 如何通過Key 引用一個成員 – [Dimension].[Hierarchy].&[Member Key] 示例 – [Product].[Category].&[1]

18. 如何在用戶自定義層次結構中通過某個Level來訪問一個成員 – [Dimension].[Hierarchy].[Level].[Member Name] [Date].[Calendar-To-Fiscal Year].[Calendar Year].[CY 2003]

19. 如何通過元組Tuple定位到一個Cell 單元格 引用成員的結構是 […].[…].[….],引用元組是通過一對圓括號將成員括起來來定位Cube空間的一個點. ([….].[….].[….], [….].[….].[….], [….].[….].[….])

20. 如何來查看返回Cell中的其它屬性 – CELL PROPERTIES

文章出處:MDX Step by Step 讀書筆記(三) - Understanding Tuples (理解元組)

【轉載】MDX Step by Step 讀書筆記(三) - Understanding Tuples (理解元組)