MDX 的關鍵概念 (MDX)
您可以使用多維度運算式 (MDX) 來查詢多維度資料,或建立用於 Cube 內的 MDX 運算式,但首先您必須了解 MicrosoftSQL ServerAnalysis Services 維度概念和詞彙。下節提供所需的基本維度模型概念和詞彙的簡短描述。後面章節說明如何運用這些概念。
如需詳細資訊,請參閱 Microsoft TechNet 網站上<SQL Server 2005 - Analysis Services>(英文) 網頁的<其他資源>一節。如需有關 MDX 查詢和計算相關效能問題的詳細資訊,請參閱《SQL Server 2005 Analysis Services 效能指南》(英文) 的<撰寫有效率的 MDX>一節。
維度模型詞彙和概念
MicrosoftSQL ServerAnalysis Services Cube 是根據量值、維度及維度屬性所組成的。下表描述您必須了解的維度模型詞彙和概念,以使用 MDX 運算式語言。
資料庫維度
「資料庫維度」是與索引鍵屬性相關的維度屬性集合,而索引鍵屬性則與量值維度中的事實相關。維度屬性
「維度屬性」繫結至維度資料表中的一或多個資料行,並且包含成員。維度屬性可能包含客戶名稱、月份名稱、產品名稱。成員
「成員」是維度屬性的值,包括量值維度。階層中的成員可以是分葉成員、父成員、資料成員或 (全部) 成員。量值
「量值」是來自事實資料表的值,也稱為「事實」。量值維度中的值有時也泛稱為「成員」。量值一般是數值,但也可以是字串值。量值維度
「量值維度」是包含 Cube 所有量值的維度。量值維度是特殊類型的維度,一般是根據存在指定量值之每個維度屬性的目前成員,來彙總其成員 (一般依據總合或依據計數)。量值群組
在 SQL Server Analysis Services 中,「量值群組」是 Cube 中的相關量值集合 (一般是來自相同事實資料表的量值)。在 SQL Server Analysis Services 中,Cube 可以包含多個量值群組。(全部) 成員
「(全部) 成員」是屬性階層或使用者自訂階層中所有成員的導出值。導出成員
「導出成員」是在查詢時定義及計算的維度成員。導出成員可以定義在使用者查詢或 MDX 計算指令碼中,並且儲存在伺服器。導出成員會對應到定義所在之維度中的資料表資料列。資料成員
「資料成員」是在父子式階層中與父成員關聯的子成員。資料成員包含其父成員的資料值,而非其父成員之子系的彙總值。父成員
「父成員」是父子式階層中包含其子系之彙總值的成員。分葉成員
「分葉成員」是階層中沒有子系的成員。子成員
「子成員」是階層中在最上層底下的成員。索引鍵屬性
資料庫維度的「索引鍵屬性」是維度中所有非索引鍵屬性 (直接或間接) 連結到的屬性。索引鍵屬性通常也是資料粒度屬性。資料粒度屬性
Cube 維度中將維度連接到量值維度中量值群組之事實的屬性。如果資料粒度屬性和索引鍵屬性是不同的屬性,則必須將非索引鍵屬性直接或間接連結至資料粒度屬性。在 Cube 內,資料粒度屬性會定義維度的資料粒度。Cube 維度
「Cube 維度」是 Cube 中資料庫維度的執行個體。屬性階層
「屬性階層」是包含下列層級的屬性成員階層:包含每個相異屬性成員的分葉層級,分葉層級的每個成員也稱為「分葉成員」。
中繼層級,如果屬性階層是父子式階層。
包含屬性階層之分葉成員彙總值的選擇性 (全部) 層級 (IsAggregatable=True),(全部) 層級的成員也稱為「(全部) 成員」。
依預設,每個維度屬性都定義一個屬性階層 (AttributeHierarchyEnabled=True)。屬性階層依預設是可見的 (AttributeHierarchyVisible=True)。
對稱的階層
「對稱的階層」是最上層和任何分葉成員之間存在有相同層級數目的階層。不完全階層
請參閱「不對稱的階層」。不對稱的階層
「不對稱的階層」是最上層和分葉層級之間存在有不同層級數目的階層。不完全階層的範例是父子式階層。不對稱的階層也稱為「不完全階層」。父子式階層
「父子式階層」是特殊類型的屬性階層,其中維度的屬性是設為類型 parent。父子式階層是一種由子成員和父成員組成的不對稱階層。父子式階層包含下列層級:包含父成員之子系的子層級。父成員的子系包含彙總至父成員的屬性成員,包括資料成員。
包含父成員的中繼層級。
包含父子式階層分葉成員之彙總值的選擇性 (全部) 層級 (IsAggregatable=True),(全部) 層級的成員也稱為「(全部) 成員」。
每個維度只能存在一個父子式階層,並且父子式階層必須與索引鍵屬性相關。
使用者自訂階層
「使用者自訂階層」是由屬性階層組成的對稱階層,用來幫助使用者瀏覽 Cube 資料。使用者自訂的階層不會新增至 Cube 空間。在某些情況下,可以隱藏使用者自訂階層中的層級,並顯示成不對稱。屬性關聯性
「屬性關聯性」是屬性間的一對多關聯性,例如,州和城市維度屬性之間的關聯性。成員屬性
「成員屬性」是屬性 (Attribute) 成員的屬性 (Property),例如,客戶性別或產品色彩。資料格
Cube 中的「資料格」是存在於量值維度成員之成員和 Cube 中每個屬性階層之成員交集處的空間。量值維度的成員可以是分葉成員 (個別事實) 或彙總成員 (例如特定年度的彙總銷售額)。
維度中的成員可以是分葉成員、資料成員、父成員或 (全部) 成員。
Cube 空間
「Cube 空間」是 Cube 屬性階層中具有 Cube 量值之成員的乘積。Subcube
「Subcube」是代表已篩選之 Cube 檢視的 Cube 子集。Subcube 可以使用 MDX 計算指令碼的 Scope 陳述式或 MDX 查詢的 subselect 子句加以定義。使用 Subselect 的 Subcube
使用 MDX 查詢的 subselect 子句所定義的 Subcube 包含 Subcube 定義的所有成員,這有下列結果:包含階層的 (全部) 成員相當於包含階層的每個分葉成員。
如果包含任何成員,同時會包含其上階和下階。
如果包含使用者自訂階層中層級的每個成員,同時會包含該使用者自訂階層的所有成員,但會排除其他階層中不與該層級之成員同時存在的成員 (例如不包含客戶的城市)。
Cube 中的每個 (全部) 成員一律存在從 Cube 建立的 Subcube 中。
Subcube 內的彙總值可以用視覺化的方式總計。
Tuple
根據屬性成員的組合 (由 Cube 中每個屬性階層的屬性組成),Tuple 會唯一識別資料格。在 MDX 查詢或運算式中定義 Tuple 時,您不需明確包含每個屬性階層的屬性成員。如果屬性階層的成員沒有明確包含在查詢或運算式中,該屬性階層的預設成員就是 Tuple 中隱含包含的屬性成員。除非 Cube 中另有明確定義,否則每個屬性階層的預設成員就是 (全部) 成員 (如果 (全部) 成員存在的話)。如果 (全部) 成員不存在屬性階層中,預設成員就是屬性階層的最上層成員。除非明確定義了預設量值,否則預設量值就是 Cube 中第一個指定的量值。如需詳細資訊,請參閱<定義預設成員>和<DefaultMember (MDX)>。
例如,藉由明確定義 Measures 維度的單一成員,下列 Tuple 會識別 Adventure Works 資料庫中的單一資料格。
(Measures.[Reseller Sales Amount])
上述範例唯一識別由 Measures 維度之 Reseller Sales Amount 成員及 Cube 中每個屬性階層之預設成員組成的資料格。除了 Destination Currency 屬性階層,每個屬性階層的預設成員都是 (全部) 成員。Destination Currency 階層的預設成員是 US Dollar 成員 (在 Adventure Works Cube 的 MDX 指令碼中定義這個預設成員)。
重要事項 |
---|
Tuple 中屬性階層的成員也會受到維度內所定義的屬性之間的關聯性所影響。如需詳細資訊,請參閱後面的<屬性關聯性和 Cube 空間>。 |
下列查詢會傳回上述範例中指定 Tuple 所參考之資料格的值:($80,450.596.98)。
SELECT
Measures.[Reseller Sales Amount] ON COLUMNS
FROM [Adventure Works]
[!附註]
當您在查詢中指定集合 (此處由單一 Tuple 組成) 的座標軸時,必須先指定資料行軸的集合,然後指定資料列軸的集合。資料行軸也可以用 axis(0) 或僅僅 0 的方式來參考。如需有關 MDX 查詢的詳細資訊,請參閱<基本 MDX 查詢 (MDX)>。
您可以在查詢中使用 Tuple,來傳回 Tuple 所參考之資料格的值,如上述範例所示。或者,您也可以在運算式中使用 Tuple,明確參考 Tuple 中指定的成員。查詢或運算式可以利用會傳回或取用 Tuple 的函數。Tuple 可以用來參考 Tuple 所指定之資料格的值,或在函數中使用時用來指定成員組合。
Tuple 的「維度性」是指 Tuple 中的成員順序。因為隱含成員一律以相同順序出現,所以就 Tuple 的明確定義成員方面最常考慮到維度性。當您定義一組 Tuple 時,Tuple 的成員順序很重要。下列範例包含資料行軸上 Tuple 的兩個成員。
SELECT
([Measures].[Reseller Sales Amount],[Date].[Calendar Year].[CY 2004]) ON COLUMNS
FROM [Adventure Works]
[!附註]
當您從一個以上的維度明確指定 Tuple 的成員時,必須用括號含括整個 Tuple。只指定 Tuple 中的單一成員時,括號是選擇性的。
在上述範例中,查詢中的 Tuple 指定傳回位於 Measures 維度之 Reseller Sales Amount 和 Date 維度中 Calendar Year 屬性階層之 CY 2004 成員交集處的 Cube 資料格。
[!附註]
屬性成員可以由其成員名稱或成員索引鍵參考。在上述範例中,您可以將 [CY 2004] 的參考取代成 &[2004]。
集合
集合是具相同維度性之 Tuple 的已排序集合。以下是集合的範例。
SELECT
{
([Measures].[Reseller Sales Amount],
[Date].[Calendar Year].[CY 2003]),
([Measures].[Reseller Sales Amount],
[Date].[Calendar Year].[CY 2004])
} ON COLUMNS
FROM [Adventure Works]
[!附註]
使用大括號 {} 來指定一組 Tuple。
在上述範例中,集合中的每個 Tuple 都有相同的維度性,因為每個 Tuple 的第一個成員都是 Measures 維度的成員,而且每個 Tuple 的第二個成員都是 Calendar Year 屬性階層的成員。如果任何一個 Tuple 的第二個成員來自 Date 維度的不同屬性階層 (例如 Calendar Month),您會收到錯誤,指出維度性的差異。
提示 |
---|
您可以使用別名來建立集合,稱為「命名集」。使用命名集會讓 MDX 查詢更清楚易懂,或在使用複雜 MDX 運算式時重複使用。若要使用命名集,請在集合識別碼結尾使用 "AS" 一字,後面接著所需的別名。 |
Cube 空間和自動存在
此主題的前面將「Cube 空間」定義為其屬性階層之成員的乘積。「自動存在」的概念將此 Cube 空間限制於實際存在的資料格。維度中屬性階層的成員可能不與相同維度中另一個屬性階層的成員同時存在。
例如,如果 Cube 有 City 屬性階層、Country 屬性階層及 Internet Sales Amount 量值,此 Cube 的空間只會包含同時存在的成員。例如,如果 City 屬性階層包含紐約、倫敦、巴黎、東京及墨爾本等城市,並且 Country 屬性階層包含美國、英國、法國、日本及澳洲等國家 (地區),則 Cube 的空間不會包含巴黎和美國交集的空間 (資料格)。
當查詢不存在的資料格時,不存在的資料格會傳回 Null,也就是說,它們不包含計算,而且您無法定義寫入此空間的計算。例如,下列陳述式包括了不存在的資料格。
SELECT [Customer].[Gender].[Gender].Members ON COLUMNS,
{[Customer].[Customer].[Aaron A. Allen]
,[Customer].[Customer].[Abigail Clark]} ON ROWS
FROM [Adventure Works]
WHERE Measures.[Internet Sales Amount]
[!附註]
這個查詢使用 Members (Set) (MDX) 函數,來傳回資料行軸上 Gender 屬性階層的成員集合,並且將該集合與資料列軸上 Customer 屬性階層的指定成員集合相交。
當您執行上述查詢時,Aaron A. Allen 和 Female 交集處的資料格會顯示 Null。同樣地,Abigail Clark 和 Male 交集處的資料格也會顯示 Null。這些資料格不存在,也不包含值,但在查詢傳回的結果中會出現不存在的資料格。
當您使用 Crossjoin (MDX) 函數,傳回相同維度中多個屬性階層之成員的交叉乘積時,自動存在功能會將所傳回的 Tuple 限制於實際存在的 Tuple 集合,而不會傳回整個笛卡兒乘積。例如,執行下列查詢,然後檢查執行的結果。
SELECT CROSSJOIN
(
{[Customer].[Country].[United States]},
[Customer].[State-Province].Members
) ON 0
FROM [Adventure Works]
WHERE Measures.[Internet Sales Amount]
[!附註]
請注意,0 是用來指定資料行軸,為 axis(0) (即資料行軸) 的縮寫。
上述查詢只會針對查詢中每個屬性階層之同時存在的成員傳回資料格。上述查詢也可以使用 * (Crossjoin) (MDX) 函數中新的 * 變數,改寫如下。
SELECT
[Customer].[Country].[United States] *
[Customer].[State-Province].Members
ON 0
FROM [Adventure Works]
WHERE Measures.[Internet Sales Amount]
上述查詢也可以撰寫成下列方式:
SELECT [Customer].[State-Province].Members
ON 0
FROM [Adventure Works]
WHERE (Measures.[Internet Sales Amount],
[Customer].[Country].[United States])
所傳回的資料格值將會相同,不過結果集中的中繼資料將會不同。例如,在上述查詢中,Country 階層已移至 slicer 座標軸 (在 WHERE 子句中),因此不會明確出現在結果集中。
上述這三個查詢示範了 SQL ServerAnalysis Services 中自動存在行為的作用。
使用者自訂階層和 Cube 空間
在本主題的先前範例中,使用屬性階層來定義 Cube 空間中的位置。然而,您也可以利用使用者自訂階層 (已經根據維度中的屬性階層加以定義),定義 Cube 空間中的位置。使用者自訂階層是由屬性階層組成的階層,設計目的為幫助使用者瀏覽 Cube 資料。
例如,上節中的 CROSSJOIN 查詢也可以撰寫如下:
SELECT CROSSJOIN
(
{[Customer].[Country].[United States]},
[Customer].[Customer Geography].[State-Province].Members
)
ON 0
FROM [Adventure Works]
WHERE Measures.[Internet Sales Amount]
在上述查詢中,Customer 維度內的 Customer Geography 使用者自訂階層是用來定義 Cube 空間中的位置 (先前是使用屬性階層加以定義)。使用屬性階層或使用者自訂階層,都可以定義 Cube 空間中的相同位置。
屬性關聯性和 Cube 空間
定義相關屬性之間的屬性關聯性,會提高查詢效能 (藉由促進適當彙總的建立),並且會影響與屬性階層成員同時出現的相關屬性階層成員。例如,當您定義的 Tuple 包含 City 屬性階層的成員,並且該 Tuple 沒有明確定義 Country 屬性階層成員,您可能預期預設的 Country 屬性階層成員將會是 Country 屬性階層的相關成員。然而,只有在 City 屬性階層和 Country 屬性階層之間已定義屬性關聯性時,這個狀況才會屬實。
下列範例會傳回查詢中沒有明確包含之相關屬性階層的成員。
WITH MEMBER Measures.x AS
Customer.Country.CurrentMember.Name
SELECT Measures.x ON 0,
Customer.City.Members ON 1
FROM [Adventure Works]
[!附註]
請注意,WITH 關鍵字是與 CurrentMember (MDX) 和 Name (MDX) 函數搭配使用,可建立查詢中所使用的導出成員。如需詳細資訊,請參閱<基本 MDX 查詢 (MDX)>。
在上述查詢中,會傳回與 State 屬性階層之每個成員相關的 Country 屬性階層的成員名稱。預期的 Country 成員會出現 (因為 City 和 Country 屬性之間已定義屬性關聯性)。然而,如果相同維度中的多個屬性階層之間沒有定義屬性關聯性,則會傳回 (全部) 成員,如下列查詢所說明。
WITH MEMBER Measures.x AS
Customer.Education.Currentmember.Name
SELECT Measures.x ON 0,
Customer.City.Members ON 1
FROM [Adventure Works]
在上述查詢中,會傳回 (全部) 成員 ("All Customers"),因為 Education 和 City 之間沒有關聯性。因此,在包含 City 屬性階層但沒有明確提供 Education 成員的任何 Tuple 中,Education 屬性階層的 (全部) 成員將會是 Education 屬性階層的預設成員。
計算內容
每個集合、成員、Tuple 或數值函數都是在整個 MDX 運算式或陳述式的內容中執行。傳遞引數 (例如 Tuple) 至函數時,只會明確提供 Cube 空間中的部分座標。其他座標是根據目前的計算內容取得。未指定之資料格座標和屬性成員的計算內容是依下列順序決定:
FROM 子句 (如果有的話) - 採用 SELECT 陳述式的格式,這個子句可以指定整個 Cube,也可以指定 Subcube。
WHERE 子句 (如果有的話) - 這個子句也稱為「slicer 座標軸」,用來指定集合、Tuple 或成員,可限制查詢所傳回之資料行和資料列軸上的成員。概念上,資料行或資料列軸上沒有明確指定之每個屬性階層的預設成員都是 slicer 座標軸的一部分。
[!附註]
當 slicer 座標軸和另一個座標軸上指定了特定屬性的資料格座標時,函數中指定的座標會優先使用來決定座標軸上的成員集合。Filter (MDX) 和 Order (MDX) 函數是這類函數的範例 - 您可以使用 WHERE 子句,或 FROM 子句的 SELECT 陳述式,依據從計算內容排除的屬性成員來篩選或排序結果。
在查詢或運算式中定義的命名集和導出成員。
資料列和資料行軸上指定的 Tuple 和集合,利用資料列、資料行或 slicer 座標軸上沒有出現之屬性的預設成員。
每個座標軸上的 Cube 或 Subcube 資料格,刪除座標軸上的空 Tuple 並且套用 HAVING 子句。
如需詳細資訊,請參閱<建立查詢中的 Cube 內容 (MDX)>。
在下列查詢中,資料列軸的計算內容受到 WHERE 子句中指定之 Country 屬性成員和 Calendar Year 屬性成員限制。
SELECT Customer.City.City.Members ON 0
FROM [Adventure Works]
WHERE (Customer.Country.France, [Date].[Calendar].[Calendar Year].[CY 2004],
Measures.[Internet Sales Amount])
- 然而,如果您透過指定資料列軸上之 FILTER 函數的方式修改這個查詢,並且利用 FILTER 函數中的 Calendar Year 屬性階層成員,就可以修改 Calendar Year 屬性階層的屬性成員,這是用來提供資料行軸上集合成員的計算內容。
SELECT FILTER
(
Customer.City.City.Members,
([Date].[Calendar].[Calendar Year].[CY 2003],
Measures.[Internet Order Quantity]) > 75
) ON 0
FROM [Adventure Works]
WHERE (Customer.Country.France,
[Date].[Calendar].[Calendar Year].[CY 2004],
Measures.[Internet Sales Amount])
- 在上述查詢中,資料行軸上所出現之 Tuple 內資料格的計算內容是依 Calendar Year 屬性階層的 CY 2003 成員篩選,可是 Calendar Year 屬性階層的名義計算內容則是 CY 2004。此外,它是依 Internet Order Quantity 量值篩選。然而,一旦設定資料行軸上的集合成員,座標軸上所出現之成員之值的計算內容會再度由 WHERE 子句決定。
重要事項 |
---|
若要提高查詢效能,您應在解析程序中盡早刪除成員和 Tuple。如此一來,最終一個成員集合上的複雜查詢時間計算便會盡可能在最少的資料格上運作。 |
重要事項 |
---|
運算式評估所依據的行程和解決順序與運算式的最終值有關。如需有關這些值可能會如何影響計算的詳細資訊,請參閱<了解行程順序與解決順序 (MDX)>。 |