MDX 數據操作 - 了解傳遞順序和解決順序
適用於: SQL Server Analysis Services Azure Analysis Services Fabric/Power BI Premium
當 Cube 計算為 MDX 腳本的結果時,可以根據各種計算相關功能的使用,進行許多計算階段。 每個階段稱為計算階段。
計算階段可以透過序數位置來參考,稱為計算階段數。 完全計算 Cube 所有數據格所需的計算階段計數,稱為 Cube 的計算傳遞深度。
事實數據表和回寫數據只會影響傳遞 0。 腳本會在傳遞 0 之後填入數據;腳本中的每個指派和計算語句都會建立新的傳遞。 在 MDX 腳本之外,絕對傳遞 0 的參考會參考 Cube 腳本所建立的最後一個傳遞。
匯出成員會建立於所有階段,但表達式會套用至目前階段。 先前的傳遞包含導出量值,但具有 Null 值。
解決順序
解決順序會決定競爭表達式時計算的優先順序。 在單一階段內,解決順序會決定兩件事:
SQL Server SQL Server Analysis Services Microsoft評估維度、成員、匯出成員、自定義匯總和匯出數據格的順序。
SQL Server Analysis Services 計算自定義成員、匯出成員、自定義匯總和導出單元格的順序。
具有最高解決順序的成員優先。
注意
此優先順序的例外狀況是 Aggregate 函式。 具有 Aggregate 函數的導出成員的求解順序比任何交集計算量值都低。
解決順序值和優先順序
解決順序值的範圍可以從 -8181 到 65535。 在此範圍中,某些解決順序值會對應至特定類型的計算,如下表所示。
計算 | 解決順序 |
---|---|
自訂成員公式 | -5119 |
一元運算子 | -5119 |
視覺效果總計計算 | -4096 |
所有其他計算(如果未指定的話) | 0 |
強烈建議您在設定求解順序值時,只使用正整數。 如果您指派的值低於上表所示的求解順序值,計算階段可能會變得無法預測。 例如,計算成員的計算會收到低於預設自定義積存公式值 -5119 的求解順序值。 如此低的求解順序值會導致匯出成員在自定義匯總公式之前計算,而且可能會產生不正確的結果。
建立和變更解決順序
在 [Cube 設計師] 的 [計算窗格]上,您可以藉由變更計算的順序來變更計算成員和匯出單元格的求解順序。
在 MDX 中,您可以使用 SOLVE_ORDER 關鍵詞來建立或變更匯出成員和匯出儲存格。
解決順序範例
為了說明解決順序的潛在複雜度,下列一系列的 MDX 查詢會從每個個別沒有解決順序問題的兩個查詢開始。 然後,這兩個查詢會合併成需要解決順序的查詢。
查詢收入和費用的 1 差異
針對第一個 MDX 查詢,藉由建構類似下列範例的簡單 MDX 查詢,計算每年銷售額和成本的差異:
WITH
MEMBER
[Date].[Calendar].[Year Difference] AS ([Date].[Calendar].[Calendar Year].&[2008] - [Date].[Calendar].[Calendar Year].&[2007] )
SELECT
{[Measures].[Internet Sales Amount], [Measures].[Internet Total Product Cost] }
ON COLUMNS ,
{ [Date].[Calendar].[Calendar Year].&[2007], [Date].[Calendar].[Calendar Year].&[2008], [Date].[Year Difference] }
ON ROWS
FROM [Adventure Works]
在這裡查詢中,只有一個匯出成員,Year Difference
。 因為只有一個導出成員,因此只要 Cube 不使用任何匯出成員,解決順序就不是問題。
此 MDX 查詢會產生類似下表的結果集。
因特網銷售金額 | 因特網產品總成本 | |
---|---|---|
CY 2007 | $9,791,060.30 | $5,718,327.17 |
CY 2008 | $9,770,899.74 | $5,721,205.24 |
年差異 | (20,160.56美元) | $2,878.06 |
查詢費用后收入的2百分比
針對第二個查詢,使用下列 MDX 查詢計算每年費用后的收入百分比:
WITH
MEMBER
[Measures].[Profit Margin] AS
([Measures].[Internet Sales Amount] - [Measures].[Internet Total Product Cost] ) / [Measures].[Internet Sales Amount] ,
FORMAT_STRING="Percent"
SELECT
{[Measures].[Internet Sales Amount], [Measures].[Internet Total Product Cost], [Measures].[Profit Margin] }
ON COLUMNS ,
{ [Date].[Calendar].[Calendar Year].&[2007], [Date].[Calendar].[Calendar Year].&[2008] }
ON ROWS
FROM [Adventure Works]
這個 MDX 查詢,就像前一個查詢一樣,只有單一導出成員,Profit Margin
,因此沒有任何解決順序複雜。
此 MDX 查詢會產生稍微不同的結果集,如下表所示。
因特網銷售金額 | 因特網產品總成本 | 獲利率 | |
---|---|---|---|
CY 2007 | $9,791,060.30 | $5,718,327.17 | 41.60% |
CY 2008 | $9,770,899.74 | $5,721,205.24 | 41.45% |
第一個查詢和第二個查詢的結果集差異來自計算成員的位置差異。 在第一個查詢中,匯出成員是ROWS軸的一部分,而不是第二個查詢中顯示的COLUMNS軸。 下一個查詢中放置的差異會變得很重要,這會結合單一 MDX 查詢中的兩個導出成員。
查詢 3 合併年份差異和凈收益計算
在這個將上述兩個範例合併成單一 MDX 查詢的最後一個查詢中,由於數據行和數據列的計算,解決順序變得很重要。 若要確定計算是以正確的順序進行,請使用 SOLVE_ORDER 關鍵詞來定義計算發生的序列。
SOLVE_ORDER 關鍵詞會指定 MDX 查詢或 CREATE MEMBER 命令中匯出成員的求解順序。 與 SOLVE_ORDER 關鍵詞搭配使用的整數值是相對的、不需要從零開始,而且不需要連續。 值只會告知 MDX 根據衍生自計算具有較高值之成員的值來計算成員。 如果未定義導出成員,但沒有 SOLVE_ORDER 關鍵詞,則計算成員的預設值為零。
例如,如果您結合前兩個範例查詢中使用的計算,則兩個匯出成員,Year Difference
和 Profit Margin
,會在 MDX 查詢範例結果數據集的單一數據格上交集。 判斷 SQL Server Analysis Services 如何評估此數據格的唯一方式,是依求解順序。 用來建構此儲存格的公式會根據兩個匯出成員的求解順序產生不同的結果。
首先,請嘗試結合下列 MDX 查詢中前兩個查詢中使用的計算:
WITH
MEMBER
[Date].[Calendar].[Year Difference] AS ([Date].[Calendar].[Calendar Year].&[2008] - [Date].[Calendar].[Calendar Year].&[2007] ) ,
SOLVE_ORDER = 1
MEMBER
[Measures].[Profit Margin] AS
( [Measures].[Internet Sales Amount] - [Measures].[Internet Total Product Cost] ) / [Measures].[Internet Sales Amount] ,
FORMAT_STRING="Percent" ,
SOLVE_ORDER = 2
SELECT
{[Measures].[Internet Sales Amount], [Measures].[Internet Total Product Cost], [Measures].[Profit Margin] }
ON COLUMNS ,
{ [Date].[Calendar].[Calendar Year].&[2007], [Date].[Calendar].[Calendar Year].&[2008], [Date].[Year Difference] }
ON ROWS
FROM [Adventure Works]
在這個結合的 MDX 查詢範例中,Profit Margin
具有最高的求解順序,因此當兩個運算式互動時,它會優先使用。 SQL Server Analysis Services 會使用 Profit Margin
公式來評估有問題的單元格。 這個巢狀計算的結果,如下表所示。
因特網銷售金額 | 因特網產品總成本 | 獲利率 | |
---|---|---|---|
CY 2007 | $9,791,060.30 | $5,718,327.17 | 41.60% |
CY 2008 | $9,770,899.74 | $5,721,205.24 | 41.45% |
年差異 | (20,160.56美元) | $2,878.06 | 114.28% |
共用儲存格中的結果是以 Profit Margin
公式為基礎。 也就是說,SQL Server Analysis Services 會使用 Year Difference
數據計算共用數據格中的結果,併產生下列公式(結果會進位以便清楚起見):
((9,770,899.74 - 9,791,060.30) - (5,721,205.24 - 5,718,327.17)) / (9,770,899.74 - 9,791,060.30) = 1.14275744
或
(23,038.63) / (20,160.56) = 114.28%
這顯然不正確。 不過,如果您切換 MDX 查詢中匯出成員的求解順序,SQL Server Analysis Services 會以不同的方式計算共用數據格中的結果。 下列合併的 MDX 查詢會反轉匯出成員的求解順序:
WITH
MEMBER
[Date].[Calendar].[Year Difference] AS ([Date].[Calendar].[Calendar Year].&[2008] - [Date].[Calendar].[Calendar Year].&[2007] ) ,
SOLVE_ORDER = 2
MEMBER
[Measures].[Profit Margin] AS
( [Measures].[Internet Sales Amount] - [Measures].[Internet Total Product Cost] ) / [Measures].[Internet Sales Amount] ,
FORMAT_STRING="Percent" ,
SOLVE_ORDER = 1
SELECT
{[Measures].[Internet Sales Amount], [Measures].[Internet Total Product Cost], [Measures].[Profit Margin] }
ON COLUMNS ,
{ [Date].[Calendar].[Calendar Year].&[2007], [Date].[Calendar].[Calendar Year].&[2008], [Date].[Year Difference] }
ON ROWS
FROM [Adventure Works]
當導出成員的順序已切換時,SQL Server Analysis Services 會使用 Year Difference
公式來評估單元格,如下表所示。
因特網銷售金額 | 因特網產品總成本 | 獲利率 | |
---|---|---|---|
CY 2007 | $9,791,060.30 | $5,718,327.17 | 41.60% |
CY 2008 | $9,770,899.74 | $5,721,205.24 | 41.45% |
年差異 | (20,160.56美元) | $2,878.06 | (0.15%) |
由於此查詢會使用 Year Difference
公式搭配 Profit Margin
數據,因此共用儲存格的公式類似下列計算:
(($9,770,899.74 - 5,721,205.24) / $9,770,899.74) - ((9,791,060.30 - 5,718,327.17) / 9,791,060.30) = -0.15
或
0.4145 - 0.4160= -0.15
其他考慮
解決順序可能是處理非常複雜的問題,特別是在包含導出成員、自定義積存公式或導出數據格之大量維度的 Cube 中。 當 SQL Server Analysis Services 評估 MDX 查詢時,SQL Server Analysis Services 會考慮指定傳遞內所有相關專案的求解順序值,包括 MDX 查詢中指定的 Cube 維度。
另請參閱
CalculationCurrentPass (MDX)
CalculationPassValue (MDX)
CREATE MEMBER 語句 (MDX)
操作數據 (MDX)