共用方式為


避免使用 FILTER 作為 filter 自變數

身為數據模型師,您通常會撰寫 DAX 表達式,這些表達式需要在修改過的 filter 背景中進行評估。 例如,您可以撰寫 measure 定義至 calculate「高利潤產品」的銷售。 我們將在本文稍後說明這項計算。

注意

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

CALCULATE and CALCULATETABLE DAX 函式很重要,and 實用的函式。 這讓您撰寫計算,以移除 or ,新增 filters,修改 or 的關係路徑。 其完成方式是傳入 filter 個引數,這些引數可以是布爾表達式、數據表運算式,或者 or 特殊 filter 函式。 我們在本文中只會討論布爾 and 表格運算式。

請考慮下列 measure 定義,其會使用數據表表達式來計算紅色 product 銷售額。 它會 replace 任何可能應用於 Product 表格的 filters。

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

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

以下是改良 measure 定義,其使用布爾表達式,而不是數據表表達式。 KEEPFILTERS DAX 函式可確保套用至 Color 數據行的任何現有 filters 得以保留,不會被 andnot 覆寫。

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

建議您盡可能將 filter 自變數傳遞為布爾表達式。 這是因為「匯入」模型資料表位於記憶體內部資料行存放區。 它們被明確地優化以高效處理 filter 列。

不過,當布爾表達式被用作 filter 參數時,會有適用於布爾表達式的限制。 其:

  • 無法從多個資料表參考資料行
  • 無法參考 measure
  • 無法使用巢狀 CALCULATE 函式
  • 無法使用掃描 or 並傳回表格的函式

這表示您必須針對更複雜的 filter 需求使用數據表表達式。

請將 now 視為不同的 measure 定義。 要求是要進行 calculate 銷售,但僅限於已達成盈利的月份。

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

在此範例中,必須使用 FILTER 函式。 這是因為需要評估 利潤measure,以便剔除那些未能盈利的月份。 當布爾表達式作為 filter 自變數使用時,not 可以在布爾運算式中使用 measure。

建議

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

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

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