本節說明如何在數據分析表達式中建立篩選 (DAX) 公式。 您可以在公式中建立篩選,以限制來自用於計算之源數據的值。 方法是將表格指定為公式的輸入,然後定義篩選表達式。 您提供的篩選表達式可用來查詢數據,並只會傳回源數據的子集。 每次您更新公式的結果時,篩選都會動態套用,視您數據的目前內容而定。
本文內容
在公式中使用的表格上建立篩選
您可以在以表格做為輸入的公式中套用篩選。 您不需要輸入表格名稱,而是使用 FILTER 函數從指定的數據表定義列的子集合。 該子集接著會傳遞至另一個函數,以進行自定義匯總等作業。
例如,假設您有一份數據表,其中包含轉銷商的訂單資訊,而您想要計算每個轉銷商賣出多少商品。 不過,您只想要顯示銷售量,只適用於銷售您較高價值產品的多個銷售單位的轉銷商。 下列公式根據 DAX 範例活頁簿,顯示使用篩選建立此計算的其中一個範例:
=SUMX (
FILTER ('ResellerSales_USD','ResellerSales_USD'[數量] > 5 && 'ResellerSales_USD'[ProductStandardCost_USD] > 100) , 'ResellerSales_USD'[SalesAmt] )-
公式的第一部分會指定其中一個匯總函數 Power Pivot ,該函數會以表格做為自變數。 SUMX 會計算表格的加總。
-
公式的第二個部分, FILTER(table, expression),告訴 SUMX 要使用哪些數據。 SUMX 需要產生數據表的數據表或表達式。 在這裡,您不需要使用表格中的所有數據,而是使用 FILTER 函數來指定要使用表格中的哪一個數據列。
篩選表達式有兩個部分:第一部分會命名套用篩選的數據表。 第二部分定義要用來做為篩選條件的表達式。 在此情況下,您要篩選銷售超過 5 個單位的轉銷商,以及價格超過 $100 美元的產品。 運算子 && 是邏輯 AND 運算子,表示條件的兩個部分必須為 True,才能讓數據列屬於篩選的子集。
-
公式的第三部分會告訴 SUMX 應加總哪些值。 在此情況下,您只使用銷售金額。
請注意,像 FILTER 這類傳回表格的函數永遠不會直接傳回表格或列,但一律會內嵌在另一個函數中。 如需 FILTER 和其他用於篩選功能的詳細資訊,包括更多範例,請參閱 篩選函數 (DAX)。
附註: 篩選表達式會受到所使用內容的影響。 例如,如果您在度量中使用篩選,而度量是用於數據透視表或樞紐分析圖,則傳回的數據子集可能會受到使用者在數據透視表中套用的其他篩選或交叉分析篩選器的影響。 如需有關上下文的詳細資訊,請參閱 DAX 公式中的上下文。
拿掉重複的篩選
除了篩選特定值之外,您還可以從另一個數據表或數據行傳回一組唯一的值。 當您想要計算欄中的唯一值數目,或將唯一值清單用於其他作業時,這會很有説明。 DAX 提供兩個函數來傳回相異值: DISTINCT 函數 和 VALUES 函數。
-
DISTINCT 函數會檢查您指定為函數自變數的單一欄,並傳回只包含相異值的新數據行。
-
VALUES 函數也會傳回唯一值的清單,但也傳回未知的成員。 當您使用兩個以關聯連接之數據表的值,且其中一個數據表中缺少值且出現在另一個數據表中的值時,此功能就很實用。 如需未知成員的詳細資訊,請參閱 DAX 公式中的上下文。
這兩個函數都會傳回一整欄的值;因此,您可以使用函數取得值清單,然後傳遞至另一個函數。 例如,您可以使用下列公式,使用唯一的產品密鑰,取得特定經銷商銷售的不同產品清單,然後使用 COUNTROWS 函數計算清單中的產品:
=COUNTROWS (distinct ('ResellerSales_USD'[ProductKey]) )
上下文如何影響篩選
當您將DAX公式新增至數據透視表或樞紐分析圖時,公式的結果可能會受到上下文的影響。 如果您使用的是 Power Pivot 數據表,上下文就是目前的數據列及其值。 如果您是在數據透視表或樞紐分析圖中工作,則上下文是指依 [剪取] 或 [篩選] 等作業所定義之數據的集合或子集。 數據透視表或樞紐分析圖的設計也會有其本身的內容。 例如,如果您建立一個依地區和年份分組銷售的數據透視表,數據透視表中只會顯示適用於這些地區和年份的數據。 因此,您新增至數據透視表的任何量值,都是根據欄名和列名的上下文,加上度量公式中的任何篩選來計算。
如需詳細資訊,請參閱 DAX 公式中的上下文。
拿掉篩選
使用複雜的公式時,您可能會想要確切知道目前的篩選是什麼,或者您可能想要修改公式的篩選部分。 DAX 提供數種函數,可讓您移除篩選,以及控制要將哪些欄保留為目前篩選上下文的一部分。 本節提供這些函數如何影響公式結果的概觀。
使用 ALL 函數覆寫所有篩選
您可以使用 ALL 函數覆寫先前套用的任何篩選,並將表格中的所有數據列傳回執行匯總或其他作業的函數。 如果您使用一或多個數據行,而非表格做為 ALL的自變數,則 ALL 函數會傳回所有數據列,並忽略任何上下文篩選。
附註: 如果您熟悉關係資料庫術語,可以將 ALL 視為產生所有數據表的自然左外部聯結。
例如,假設您有數據表「銷售」和「產品」,而您想要建立一個公式來計算目前產品的銷售總和,除以所有產品的銷售量。 您必須考慮以下事實:如果公式是以量值來使用,數據透視表的使用者可能正在使用交叉分析篩選器來篩選特定產品,並在數據列上顯示產品名稱。 因此,無論篩選器或交叉分析篩選器為何,若要取得分母的 True 值,您必須新增 ALL 函數來覆寫任何篩選。 下列公式是使用 ALL 覆寫先前篩選效果的其中一個範例:
=SUM (Sales[Amount]) /SUMX (Sales[Amount],FILTER (Sales, ALL (Products) ) )
-
公式的第一個部分 SUM (Sales[Amount]) 會計算數位。
-
加總會考慮目前的上下文,也就是說,如果您將公式新增至計算結果列,則會套用列上下文,而如果您以量值的方式將公式新增至數據透視表,則會套用數據透視表中套用的任何篩選 (篩選上下文) 。
-
公式的第二部分會計算分母。 ALL 函數會覆寫可能套用至 Products 數據表的任何篩選。
如需詳細資訊,包括詳細範例,請參閱 ALL 函數。
使用 ALLEXCEPT 函數覆寫特定篩選
ALLEXCEPT 函數也會覆寫現有的篩選,但您可以指定應保留部分現有的篩選。 您命名為 ALLEXCEPT 函數自變數的欄會指定要繼續篩選哪些欄。 如果您想要覆寫大部分欄的篩選,但並非全部,ALLEXCEPT 比 ALL 更方便。 當您建立的數據透視表可能會在許多不同的欄上篩選,而您想要控制公式中使用的值時,ALLEXCEPT 函數特別有用。 如需詳細資訊,包括如何在數據透視表中使用 ALLEXCEPT 的詳細範例,請參閱 ALLEXCEPT 函數。