在篩選上下文中,一列可能是由於應用了過濾器而被直接篩選,也可能是由於關係的傳遞,其他列被篩選而導致該列被間接篩選。因此,可以把數據模型中的篩選分爲直接過濾和交叉過濾。
直接過濾:當過濾器直接作用到表中的一列上時,該列是被直接過濾的。直接過濾是由外部的切片器和查詢上下文中的行和列過濾器確定的,不受交叉過濾器的影響。
注意:如果外部切片器沒有勾選任何選項時,默認顯示基礎表中所有的唯一值。
交叉過濾:當過濾作用於同一個表的另一列上,或作用於相關表上時,該列是被交叉過濾的,交叉過濾受到到所有篩選上下文的影響。
direct_filtered_colors = COUNTROWS((FILTERS(DimProduct[Color]))) cross_filtered_distinct_colors = COUNTROWS((DISTINCT(DimProduct[Color]))) cross_filtered_values_colors = COUNTROWS((VALUES(DimProduct[Color])))
結果分析:
direct_filtered_colors:是直接過濾,不受交叉過濾上下文的影響,直接顯式基礎表中Color的唯一值的數量,
cross_filtered_values_colors 和 cross_filtered_distinct_colors :是交叉過濾,受到交叉過濾上下文的影響,只統計被過濾之後的Color的數量。
直接過濾和交叉過濾可以通過下面兩個函數來識別:
ISCROSSFILTERED(<columnName>) ISFILTERED(<columnName>)
1,FILTERS函數
FILTERS函數返回被切片器直接篩選的值
FILTERS(<columnName>)
2,返回篩選上下文中的篩選值
如果需要返回交叉過濾的唯一值,可以使用DISTINCT 和 VALUES函數,這兩個函數都受到過濾上下文的作用,唯一的區別是:
當原始表中不存在BLANK時,DISTINCT 只返回原始表中的值,而VALUES可能會返回BLANK,該數據是被添加到查詢中用於表示不相關的行。
DISTINCT 和 VALUES函數的定義是:
DISTINCT(<table | column>) VALUES(<Table | Column>)
3,檢查是否只存在一個值
當 columnName 上的直接過濾值的數量爲 1 時,返回 TRUE,否則返回 FALSE。
HASONEFILTER(<columnName>)
該函數等價於:
COUNTROWS(FILTERS(<columnName>)) = 1
當 columnName 被篩選上下文過濾到只有一個值時,返回 TRUE。 否則爲假。
HASONEVALUE(<columnName>)
該函數等價於:
COUNTROWS(VALUES(<columnName>)) = 1
4,更爲高效的SELECTEDVALUE
當column的上下文被過濾爲只有一個唯一值時,返回該唯一值,否則返回alternateResult。
SELECTEDVALUE(<column>[, <alternateResult>])
該函數等價於:
IF(HASONEVALUE(<column>), VALUES(<column>), <alternateResult>)
參考文檔: