https://zhuanlan.zhihu.com/p/64383000
介紹過CALCULATE函數之后,有必要再介紹它的最佳搭檔:FILTER函數。
CALCULATE函數的第二個及之后的參數是篩選條件,而FILTER函數正是為篩選而生。
FILTER語法
FILTER(<table>,<filter>)
- 第一個參數<table>是要篩選的表
- 第二個參數<filter>是篩選條件
- 返回的是一張表,不能單獨使用,需要與其他函數結合使用
FILTER應用
前一篇文章中介紹CALCULATE的時候,沒有使用FILTER函數也實現了篩選,你可能會問,既然不用FILTER函數也可以,為什么還要使用FILTER呢?
那是因為前文中的篩選條件都是最簡單的篩選,沒有必要使用強大的FILTER,其實用FILTER也是可以實現的,比如這個度量值[產品數量2],
= CALCULATE([產品數量],'產品明細'[品牌]="蘋果")
等同於:
= CALCULATE([產品數量],
FILTER(ALL('產品明細'[品牌]),
'產品明細'[品牌]="蘋果"))
這兩種方式返回的結果完全一致。
在這個簡單的例子里看起來好像用FILTER寫起來更復雜,不用FILTER的情況下顯得更簡潔,但是如果我們要做更復雜的運算,通過簡單的布爾表達式根本無法實現,必須借助FILTER。
依然用介紹度量值的那篇文章中的案例數據(可點擊閱讀原文查看),有這6張表,

現在想找出年銷售額超過2000萬的城市銷售金額,這個利用簡單的表達式已無法解決,來看FILTER如何實現。
第一個度量值還是之間建好的,
銷售總額 = sum('銷售明細'[銷售額])
再建一個度量值[大於2000萬的城市銷售金額],
= CALCULATE([銷售總額],
FILTER(ALL('門店城市'),
[銷售總額]>20000000))
這個度量值先利用FILTER函數,篩選出銷售大於2000萬的城市有哪幾個,然后再匯總這些城市的銷售額,返回結果如下,

超過2000萬銷售額的城市的銷售額總計等於451026000,但發現上面明細的兩個數字之和並不等於總計,這正是PowerBI中數據模型的特點,在這個表格中,每個數據都是獨立運算的,和其他數字沒有關系。
上面兩個數字代表的是,在銷售額超過2000萬的城市中,單個產品的銷售額也大於2000萬的只有蘋果電腦和蘋果手機。
為什么會有產品的銷售額也大於2000萬這個篩選條件呢,不要忘了還有外部的篩選上下文,在這個表中即是行標簽,這兩個數字正是內部上下文和外部上下文相結合,篩選計算的結果。
這就是FILTER的一個簡單應用,這里要特別記住這個函數嵌套組合,
CALCULATE(…,FILTER(ALL(…),…))
做各種分析時會經常用到這個組合。
關於上面例子中合計金額不等於上面數據之和,雖然在PowerBI中很正常,但按通常理解的習慣,容易引起誤導,這也有解決的辦法,下篇文章介紹兩個新函數來解決它。
