1. 在 Analysis Service 分析服務中,Cube (多維數據集) 是以一個多維數據空間來呈現的。在Cube 中,每個緯度的屬性層次結構都造成了一個軸。沿着這個軸,在屬性層次結構上的每個成員包括 「ALL」 成員都在軸上佔了一個點。html
2. 包含度量值的緯度叫作事實緯度或者度量緯度,度量屬性層次結構和其它屬性層次結構的區別就是度量屬性層次結構沒有 ALL 這個成員。post
3. 成員的引用 – 引用屬性層次結構中的成員有不少方式,但基本的成員引用能夠經過與它相關聯的緯度和屬性層次結構來實現: [Dimension].[Hierarchy].[Member]。url
4. 理解這幅圖設計
在 Product 緯度中有兩個屬性層次結構 – Category 和 Subcategory,在Date 緯度中也有兩個屬性層次結構 – Calendar Year 和 Fiscal Year,這兩個屬性層次結構在一塊兒構成了一個用戶自定義的層次結構 – Calendar-To-Fiscal Year。這四個原始的屬性層次結構再加上度量值屬性層次結構,在Cube 空間裏總共有5個軸,那麼在這個緯度空間裏的點所以須要用5個元素組成的元組來定位。3d
5. 經過使用元組能夠定位到Cube 空間中的一個點。可是在這個點上,它是以一個簡單的值來顯示的,這個點能夠理解爲 Cell – 單元格。Cell 實際上是一個對象,它有不少不一樣的屬性。當訪問這個單元格時,各類不一樣的屬性會隨之返回。默認返回的屬性有 VALUE 和 FORMATTED_VALUE。htm
6. VALUE 屬性包含了聚合的度量值,這個值是在與這個單元格相關聯的其它屬性層次結構上聚合的度量值。對象
7. FORMATTED_VALUE 屬性包含了以字符串形式呈現的VALUE,這種格式化在設計階段就已經肯定了,它只是用來控制最終在MDX 查詢界面顯示的格式, 能夠經過查看 CELL PROPERTIES 來了解VALUE 和FORMATTED_VALUE。blog
CellOrdinal 屬性表示的是在查詢返回的集合中的位置。字符串
8. 能夠添加 CELL PROPERTIES 關鍵字,但這樣的話就須要顯示定義出 VALUE 和 FORMATTED_VALUE,不然這兩個屬性將不會被返回。get
下面查詢的內容將返回其它的單元格屬性 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