在公式中篩選資料

您可以在公式中建立篩選,限制來源資料要用於計算中的值。您可以指定資料表做為公式的輸入,然後定義「篩選運算式」(Filter Expression) 來完成。您提供的篩選運算式是用來查詢資料,並只傳回來源資料的子集。每次您更新公式的結果時,會根據您資料目前的內容,以動態方式套用篩選。本節描述如何在 Data Analysis Expressions (DAX) 公式中建立篩選。

在資料表上建立公式中所使用的篩選

您可以在採用資料表做為輸入的公式中套用篩選。您可以使用 FILTER 函數來定義所指定資料表中資料列的子集,而不必輸入資料表名稱。該子集隨後會傳遞至另一個函數進行運算,例如自訂的彙總。

例如,假設您有一個資料表,其中包含轉售商的訂單相關資訊,而您想要計算每個轉售商的銷售量。但是,您希望只顯示已銷售多件高價產品的轉售商之銷售量。下列公式會根據 DAX 範例活頁簿的資料,示範如何使用篩選建立這項計算:

=SUMX( 
     FILTER ('ResellerSales_USD', 'ResellerSales_USD'[Quantity] > 5 &&
     'ResellerSales_USD'[ProductStandardCost_USD] > 100), 
     'ResellerSales_USD'[SalesAmt]
     )
  • 公式的第一個部分指定 PowerPivot 的其中一個彙總函式 SUMX,此彙總函式採用資料表做為引數,計算整個資料表的總和。

  • 公式 FILTER(table, expression) 的第二個部分會告訴 SUMX 要使用的資料。SUMX 需要資料表或者會產生資料表的運算式。您可以在這裡使用 FILTER 函數來指定要使用資料表的哪些資料列,而不必使用資料表中的所有資料。

    篩選運算式有兩個部分:第一個部分命名要套用篩選的資料表,第二個部分則是定義要當做篩選條件使用的運算式。在本範例中,會篩選出銷售件數超過 5 個單位且產品價錢高於 $100 的轉售商。運算子 && 是邏輯 AND 運算子,代表這項條件的兩個部分都必須為 true 才會將資料列納入已篩選的子集。

  • 公式的第三個部分會告訴 SUMX 函數應該加總的值。本範例只有用到銷售量。

請注意,傳回資料表的函數 (如 FILTER) 絕不會將資料表或資料列直接傳到 PowerPivot 活頁簿,而會一律內嵌於其他函數之中。如需 FILTER 以及用於篩選的其他函數 (包括更多範例) 的詳細資訊,請參閱<篩選函數 (DAX)>。

[!附註]

篩選運算式會依您是在怎樣的「內容」(Context) 中使用而受到影響。例如,如果您在量值中使用篩選,並將量值用於樞紐分析表或樞紐分析圖,所傳回的資料子集可能會受到使用者已在樞紐分析表中套用的其他篩選或交叉分析篩選器之影響。如需有關內容的詳細資訊,請參閱<DAX 公式中的內容>。

移除重複項目的篩選

除了針對特定值進行篩選之外,您還可以從其他資料表或資料行傳回一組唯一的值。當您想要計算資料行中唯一值的數目時,或使用唯一值的清單進行其他運算時,這相當有幫助。DAX 提供兩個可傳回相異值的函數:DISTINCT 函數 (DAX)VALUES 函數 (DAX)

  • DISTINCT 函數會檢查您指定做為函數之引數的單一資料行,然後傳回只包含相異值的新資料行。

  • VALUES 函數也是傳回唯一值的清單,但還會傳回「未知的成員」(Unknown Member)。當您使用來自某個關聯性所聯結之兩個資料表中的值,而且某個值只在其中一個資料表中出現時,這相當有幫助。如需有關未知成員的詳細資訊,請參閱<DAX 公式中的內容>。

這兩個函數都會傳回一整個值資料行,因此,您將使用這些函數來取得隨後要傳遞至其他函數的值清單。例如,您可以使用下列公式,透過唯一產品索引鍵取得特定轉售商已銷售之相異產品的清單,然後使用 COUNTROWS 函數計算該清單中的產品個數:

=COUNTROWS(DISTINCT('ResellerSales_USD'[ProductKey]))

內容如何影響篩選

當您將 DAX 公式加入至樞紐分析表或樞紐分析圖時,公式的結果可能會受到「內容」(Context) 的影響。如果您要在 PowerPivot 資料表中作業,內容就是目前的資料列及其值。如果您要在樞紐分析表或樞紐分析圖中作業,內容表示由作業 (如配量或篩選) 定義之資料的集合或子集。樞紐分析表或樞紐分析圖的設計也會賦予它自己的內容。例如,如果您建立一個銷售量依區域和年度群組的樞紐分析表,則只有套用到這些區域和年度的資料會出現在樞紐分析表中。因此,您加入至樞紐分析表中的任何量值,都會在資料行和資料列標題以及量值公式中的任何篩選所形成的內容中進行計算。

如需詳細資訊,請參閱<DAX 公式中的內容>。

移除篩選

使用複雜的公式時,您可能會想確實知道目前的篩選,或是可能會想修改公式的篩選部分。DAX 提供一些函數可讓您移除篩選,並控制保留為目前篩選內容一部分的資料行。本節提供這些函數如何影響公式結果的概觀。

使用 ALL 函數覆寫所有篩選

您可以使用 ALL 函數來覆寫先前已套用的任何篩選,然後將資料表中的所有資料列傳回給即將執行彙總或其他運算的函數。如果您使用一個或多個資料行 (而非單一資料表) 做為 ALL, 的引數,ALL 函數會傳回所有資料列,並忽略任何內容篩選。

[!附註]

如果您熟悉關聯式資料庫術語,可以將 ALL 視為產生所有資料表的自然左方外部聯結。

例如,假設您有 Sales 和 Products 兩個資料表,而且您想要建立公式來計算目前產品之銷售量的總和除以所有產品之銷售量。您必須考慮到,如果在量值中使用公式,樞紐分析表的使用者可能會使用交叉分析篩選器,透過資料列上的產品名稱來篩選特定產品。因此,若要在不管任何篩選或交叉分析篩選器的情況下取得分母的實際值,您必須加入 ALL 函數來覆寫所有篩選。下列公式是如何使用 ALL 覆寫先前篩選結果的一個範例:

=SUM (Sales[Amount])/SUMX(Sales[Amount], FILTER(Sales, ALL(Products)))
  • 公式的第一個部分 SUM (Sales[Amount]) 會計算分子。

  • 總和會將目前的內容納入考慮,也就是說,如果您在計算結果欄中加入公式,會套用資料列內容;如果您在樞紐分析表中加入公式做為量值,則會套用在樞紐分析表中套用的所有篩選 (篩選內容)。

  • 公式的第二個部分會計算分母。ALL 函數會覆寫任何可能已套用到 Products 資料表的篩選。

如需包含詳細範例在內的詳細資訊,請參閱<ALL 函數 (DAX)>。

使用 ALLEXCEPT 函數覆寫特定篩選

ALLEXCEPT 函數也會覆寫現有的篩選,但是您可以指定應該要保留哪些現有的篩選。您指名為 ALLEXCEPT 函數之引數的資料行會指定將繼續進行篩選的資料行。如果您想要覆寫大多數 (但不是全部) 資料行的篩選,使用 ALLEXCEPT 會比 ALL 更方便。當您要建立的樞紐分析表可能會針對許多不同的資料行進行篩選,而且想要控制公式中所使用的值時,ALLEXCEPT 函數特別實用。如需詳細資訊,包括如何在樞紐分析表中使用 ALLEXCEPT 的詳細範例,請參閱<ALLEXCEPT 函數 (DAX)>。

請參閱

其他資源