视觉筛选器位于画布右侧的筛选器栏,栏位里总共有四种筛选器,作用级别分别是视觉、页面、钻取和报告。
视觉筛选器
如果你没找到这个视觉筛选器,选中任意图表就看到了,这恰好也能说明它的作用范围,只对当前图表生效,这个东西的功能比较简单,我们先从基本场景开始分析。
这是用一张 2013 到 2018 年的日期表生成的柱形图,按年统计天数。视觉筛选器中的天数和 year 是图表创建后自动添加的,我加入一个新的筛选条件 week,它是数据源中的一个计算列,返回当前日期对应的周数,从 1 到 52(或 53)循环。下面我们来做几项测试看看视觉筛选器是如何起作用的。
先用天数筛选图表
筛选天数是 366 的年份
换用 week 筛选一下
不同年份第一周的天数有所差别,没问题。
筛选条件加入一个新的度量值
不知道你注意没有,视觉筛选器是所有筛选器中唯一支持度量值做筛选条件的,因为只有图表环境才能提供明确的计值上下文。
定义一个度量值 Sum of weeknum = SUM(DIMDATE[Week]) 加入筛选器,新的度量值会在左侧图表的上下文环境计值,要用它筛选图表,必须先搞清楚它的计值结果。
相同的维度,sum of weeknum 的结果
所以我如果想用这个度量值筛选原表,比如筛选出 2016 年,可以这么设定
新度量值只参与筛选,没有被显示
以上三个例子都比较直观:修改筛选条件,计值结果发生相应变化。但这里可以问一个问题:
视觉筛选器里的约束条件是在原表计算完成后施加的?还是在原表计算前,先调整了公式的计值上下文后,原表计算才发生的?
仔细想想,出于性能考虑应该是后者,否则耗时计算出的结果最后没有使用,岂不是浪费资源。(结论的证明在文章最后给出)
其实这个规律也是其他筛选器通用的,之所以选择视觉筛选器,是因为它还可以添加度量值做筛选条件,会让结果不那么直观。
上面举的都是简单的例子,下面我们进入正题,看看在层级结构中视觉筛选器是如何生效的。这篇文章的引子来自一位朋友的问题:
提问截图
两个一模一样的图,都按季度计算[period_choice]的大小(忽略另一个度量值),从左边那个可以看出,从 2015Q1 开始[period_choice](折线)的值都为 1。右边的图表 Copy 了左边的,只在视觉筛选器设置了 period_choice=1,结果与左边的图对不上了,只剩下 2017Q3 和 2017Q4。与之前三个例子不同的是,这里的横轴用了时间层级结构。
所以这个反直觉的结果是怎么得出的?题目中的公式定义的比较复杂,为了便于理解,抽象成一个简单问题。
稍微修改一下开始时候用的例子,加入层级
还是用开始的例子,仿照步骤 1,COPY 筛选条件 天数=366,看一下什么结果
结果为空
看来在层级结构下,这次视觉筛选器的效果确实有点反直觉,不过因为这个例子足够简单,你大概能猜出来是怎么回事,筛选条件的计值上下文从年转移到了月。于是筛选条件改成[天数]=31 试试看
果然,返回了每年 31 天的月份对应的总天数。
同一个度量值,在同一个图表中,因为出现的位置不同,使用了不同的计值环境。
如果把上图的筛选过程翻译成 DAX 语言,是这样的
代码佐证了在本文中提出的计值顺序的问题:视觉筛选器创建了一个筛选条件,随后将其施加到了图表公式,改变了[天数]计值的上下文环境,这里解决了文章中的那个关于计值顺序的疑问;而在筛选条件中计算的[天数]同时考虑了年和月,这是结果反直觉的原因。
Good