共用方式為


避免使用 FILTER 作為篩選自變數

身為數據建模者,您通常會撰寫 DAX 表達式,這些表達式需要在修改的篩選內容中進行評估。 例如,您可以撰寫量值定義來計算「高利潤產品」的銷售量。 我們將在本文稍後說明這項計算。

注意

本文特別適用於將篩選套用至匯入數據表的模型計算。

CALCULATECALCULATETABLEDAX 函式是重要且實用的函式。 其可讓您撰寫可移除或新增篩選的計算,或修改關聯性路徑。 其完成方式是傳入篩選自變數,也就是布爾表達式、數據表運算式或特殊篩選函式。 我們只會討論本文中的布林和表格運算式。

請考慮下列量值定義,其會使用數據表運算式來計算紅色產品銷售。 它會取代任何可能套用至 Product 數據表的篩選條件。

Red Sales =
CALCULATE(
    [Sales],
    FILTER('Product', 'Product'[Color] = "Red")
)

CALCULATE 函式會接受 FILTERDAX 函式所傳回的數據表運算式,其會評估 Product 數據表中每個數據列的篩選表達式。 其會達到正確的結果,也就是紅色產品的銷售結果。 不過,使用布林運算式可以更有效率地達成此目的。

以下是改良的量值定義,其使用布爾運算式,而不是數據表運算式。 KEEPFILTERS DAX 函式可確保套用至 Color 列的任何現有篩選都會保留,而且不會覆寫。

Red Sales =
CALCULATE(
    [Sales],
    KEEPFILTERS('Product'[Color] = "Red")
)

建議您儘可能將篩選自變數傳遞為布爾運算式。 這是因為「匯入」模型資料表位於記憶體內部資料行存放區。 它們被明確優化,以這種方式有效地篩選列。

不過,有些限制在布爾表達式用作篩選條件時會被套用。 其:

  • 無法從多個資料表參考資料行
  • 無法參考量值
  • 無法使用巢狀 CALCULATE 函式
  • 無法使用掃描或傳回數據表的函式

這表示您必須針對更複雜的篩選需求使用數據表運算式。

現在請考慮不同的量值定義。 計算銷售額的要求是只針對有達到利潤的月份進行計算。

Sales for Profitable Months =
CALCULATE(
    [Sales],
    FILTER(
        VALUES('Date'[Month]),
        [Profit] > 0
    )
)

在此範例中,必須使用 FILTER 函式。 這是因為它需要評估 利潤 指標,以消除那些未獲得利潤的月份。 當用作篩選參數時,無法在布爾運算式中使用量值。

建議

為了獲得最佳效能,建議您盡可能使用布爾表達式作為篩選自變數。

因此,FILTER 函式只應該在必要時使用。 您可以使用它來執行篩選複雜欄位比較。 這些資料行比較可能涉及:

  • 量值
  • 其他資料行
  • 使用 ORDAX 函式或 OR 邏輯運算符 (||)