共用方式為


避免使用 FILTER 作為篩選引數

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

注意

本文特別適合將篩選條件套用至「匯入」資料表的模型計算。

CALCULATECALCULATETABLE DAX 函式是重要且有用的函式。 其可讓您撰寫可移除或新增篩選條件的計算,或修改關聯性路徑。 其做法是傳遞篩選引數,也就是布林運算式、資料表運算式或特殊篩選函式。 我們只會討論本文中的布林值和資料表運算式。

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

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

CALCULATE 函式會接受 FILTER DAX 函式所傳回的資料表運算式,這會針對 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 函式。 您可以使用該函式來執行篩選複雜資料行比較。 這些資料行比較可能涉及:

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