本節說明如何在資料分析表達式 (DAX) 公式中建立篩選器。 你可以在公式中建立過濾器,限制計算中使用的來源資料值。 你透過指定一個表格作為公式的輸入,然後定義一個濾波式來達成。 你提供的過濾表達式用來查詢資料,並只回傳來源資料的子集。 每次更新公式結果時,根據資料當前上下文,濾波器會動態應用。
本文內容
在公式中使用的表格上建立過濾器
你可以在公式中套用濾波器,這些公式會以表格作為輸入。 你不需要輸入資料表名稱,而是使用 FILTER 函式來定義指定資料表中的一部分列。 該子集接著會傳遞給另一個函式,用於自訂聚合等操作。
舉例來說,假設你有一個包含經銷商訂單資訊的資料表,你想計算每個經銷商的銷售額。 不過,你應該只顯示那些賣出多件高價值產品的轉售商的銷售金額。 以下基於 DAX 範例工作簿的公式,展示了一個利用篩選器來建立此計算的範例:
=SUMX (
過濾器 ('ResellerSales_USD','ResellerSales_USD'[數量] > 5 &&
「ResellerSales_USD」[ProductStandardCost_USD] > 100) ,
『ResellerSales_USD』[銷售部]
)
公式的第一部分指定了 Power Pivot 聚合函數之一,該函數以表格作為參數。 SUMX 計算一個表格上的求和。
公式的第二部分則
FILTER(table, expression),告訴SUMX你該使用哪些資料。SUMX需要一個表格或表達式,才能產生一個表格。 在這裡,你不是用表格裡的所有資料,而是用函FILTER式指定使用表格中哪些列。
濾波器表達式有兩個部分:第一部分標示該濾波器所適用的表格。 第二部分定義了一個用作過濾條件的表達式。 在這種情況下,你篩選的是賣出超過5件的轉售商,且產品價格超過100美元。 運算子 && 是一個邏輯 AND 運算子,表示條件的兩個部分都必須為真,該列才屬於被過濾的子集。公式的第三部分告訴
SUMX函數應該加總哪些值。 在這種情況下,你只用銷售金額。
請注意,像 FILTER 這類回傳資料表的函式,從不直接回傳該資料表或資料列,而是總是嵌入在另一個函式中。 欲了解更多關於 FILTER 及其他用於過濾的函式(包括更多範例),請參見 DAX) (Filter Functions 。注意
濾波器表達式會受到其所處情境的影響。 例如,如果您在度量中使用過濾器,而該度量被用於樞紐分析表或樞紐分析圖,回傳的資料子集可能會受到使用者在樞紐分析表中套用的額外過濾器或切片器影響。 欲了解更多關於上下文的資訊,請參閱 DAX 公式中的上下文。
移除重複內容的過濾器
除了篩選特定值外,你還可以從其他資料表或欄位回傳一組獨特的值。 當你想計算欄位中唯一值的數量,或是用唯一值清單處理其他操作時,這會很有幫助。 DAX 提供兩個用於回傳不同值的函式: DISTINCT Function 與 VALUES Function。
- DISTINCT 函式會檢查你指定的一個欄位作為函數參數,然後回傳一個只包含不同值的新欄位。
- VALUES 函式同時回傳唯一值清單,但同時也會回傳未知成員。 當你使用兩個由關聯連接的資料表的值時,這很有用,而其中一張資料表缺少某個值,而另一張資料表中存在。 欲了解更多關於未知成員的資訊,請參閱 DAX 公式中的上下文。
這兩個函式都會回傳整欄的值;因此,你用函式取得一串數值,然後再傳給另一個函數。 例如,你可以使用以下公式,利用唯一產品鍵取得特定經銷商銷售的商品清單,然後使用 COUNTROWS 函式來計算該清單中的產品:
=COUNTROWS (distinct ('ResellerSales_USD'[ProductKey]) )
情境如何影響濾鏡
當你將 DAX 公式加入樞紐分析表或樞紐分析圖時,公式的結果可能會受到上下文影響。 如果你在 Power Pivot 表格中工作,上下文是目前的列及其值。 如果你正在使用樞紐分析表或樞紐分析圖,上下文指的是透過切片或篩選等操作定義的資料集合或子集。 樞紐分析表或樞紐分析圖的設計也賦予其自身的背景。 例如,如果你建立一個依地區和年份分組銷售的樞紐分析表,樞紐分析表中只顯示適用於這些地區和年份的資料。 因此,你加入樞紐分析表的任何度量,都是在欄位和列標題以及測度公式中的篩選條件中計算的。
欲了解更多資訊,請參閱 DAX 公式中的情境。
移除過濾器
在處理複雜公式時,你可能想確切知道目前的濾波器是什麼,或者你可能想修改公式中的濾波器部分。 DAX 提供多項功能,讓你能移除過濾器,並控制哪些欄位保留為目前篩選條件的一部分。 本節概述這些函數如何影響結果,並附上公式。
用 ALL 函數覆寫所有濾波器
你可以用這個 ALL 函式覆寫先前套用的篩選,並將表格中的所有列回回執行聚合或其他操作的函式。 如果你用一個或多個欄位代替表格作為參數, ALL函 ALL 式會回傳所有列,忽略任何上下文過濾器。
注意
如果你熟悉關聯式資料庫的術語,可以把它 ALL 想像成所有資料表的自然左外連接。
舉例來說,假設你有表格「銷售」和「產品」,你想建立一個公式,計算出目前產品的銷售額總和除以所有產品的銷售額。 你必須考慮到,如果該公式被用於某項指標,樞紐分析表的使用者可能會使用切片軟體來篩選特定產品,並將產品名稱放在列上。 因此,無論使用任何濾波器或切片器,都要取得分母的真實值,必須加入 ALL 函式來覆蓋所有濾波器。 以下公式是一個使用ALL來覆寫先前濾波器效果的範例:
=SUM (銷售額[金額]) /SUMX (銷售額[金額],FILTER (銷售額,所有 (產品) ) )
- 公式的第一部分 SUM (Sales[Amount]) 計算分子。
- 這個總和會考慮當前的上下文,也就是說,如果你將公式加入計算欄位,則會套用列上下文;而如果你將公式作為度量加入樞紐分析表,則套用在樞透表中套用的過濾器, (過濾上下文) 也會套用。
- 公式的第二部分計算分母。 ALL 函式會覆寫可能套用到
Products資料表上的過濾器。
欲了解更多資訊,包括詳細範例,請參閱 ALL 功能。
使用 ALLEXCEPT 函式覆蓋特定濾波器
ALLEXCEPT 函式也會覆蓋現有的過濾器,但你可以指定保留部分現有過濾器。 你命名為 ALLEXCEPT 函式參數的欄位會指定哪些欄位會繼續被篩選。 如果你想覆蓋大多數欄位的過濾器,但不想全部覆蓋,ALLEXCEPT 比 ALL 更方便。 ALLEXCEPT 函式特別適合建立可能在多個欄位篩選的樞紐分析表,且你想控制公式中使用的值。 欲了解更多資訊,包括如何在樞紐分析表中使用 ALLEXCEPT 的詳細範例,請參見 ALLEXCEPT 函式。