DAX从入门到精通 4-5-4 介绍isfiltered,isc
这两个函数非常重要,可以帮助你更好的理解上下文的传递。另外,这是一种很好的方法,通过学习它们来介绍透视表是如何进行计算的,也就是可以检查和发现你计算的值是使用了DAX中哪个值进行计算的。
这两个函数的目的是是你可以发现,列中的所有值,在当前上下文的环境下,是否都是可见的。这两个函数是:
isfiltered:返回一个true或者false,根据你传递进参数的列名,可以检测当前的计算是否受这个列的直接筛选影响。筛选可能发生在行,列,切片器或者过滤器。
iscrossfiltered:返回一个true或者false,检测这个列是否因为另外的筛选条件通过传递而产生的,而不是因为直接的过滤条件。
这个节中,我们注重介绍使用以上函数来学习筛选上下文的传递。因此,我们建立一些表达式,用来作为学习的工具。
我们建立如下的度量值:
```
[CategoryFilter] := ISFILTERED ( 'Product Category'[Category])
```
这个简单的度量值使用了product category的列名,返回了isfiltered函数的值。接着,我们再定义第二个一样的度量值,这次使用的是product color,代码如下:
```
[ColorFilter] := ISFILTERED ( Product[ColorName] )
```
我们把两个度量值放到透视表中,然后把categories放到切片器,然后把colors放到行。结果如下:
有趣的地方是,对于category,即使我们把它添加为切片器,因为我们没有做任何选择,也就没有对category进行任何过滤。对于color,因为每行都有不同的颜色,所以行上都是有过滤条件的,只有总计是例外的。因为总计行是所有颜色,没有对任何颜色进行的筛选。
*笔记
总计的这个特点,也就是没有任何来自于行列的筛选条件应用于它上面,所以显示了不同的值。*
现在,如果你在category的切片器上选择一些值,那么结果会有些改变。现在,对于category都有过滤条件,你可以在下图中看到。切片器产生的筛选上下文还会影响到总计级别的值。
isfiltered对于发现是否有直接的过滤器作用于列很有效。列的中的值无法全部显示还有另外一种情况,就是你过滤了另外一个列。例如,如果你通过过滤color,然后使用values函数计算product表的brand,那么你得到的结果就是这特定的颜色的品牌的产品。当一个列被过滤的原因是因为另外一个列的时候,我们称这个列是交叉过滤的(cross-filtered),使用iscrossfiltered函数可以检测这个场景。
如果你把这两个度量值都添加到模型中,这次只用iscrossfiltered计算color和category
```
[CrossCategory] := ISCROSSFILTERED ( 'Product Category'[Category] )
[CrossColor] := ISCROSSFILTERED ( Product[Color] )
```
我们会看到下面的计算结果:
可以看到,color是交叉过滤的,category不是。所以这里有意思的是,为什么category不是交叉过滤的,当你过滤了一个color,你可能希望只看到对应color的的category分类的产品书。要回答这个问题,你要记得,category不是product表的列,而是在product category表,两个表之间的关系,不允许筛选条件的传递。如果你更新一下数据模型,使两个表关系的方向为双向,那么结果会不同,如下图:
这节里,我们看到了isfiltered和iscrossfiltered的使用案例,我们只是基于学习的目的,让你更好的了解筛选上下文在关系中是如何传递。后面的章节,当我们书写一些高级的DAX表达式的时候,你就会体会到,这两个函数为何如此重要。