今天我们来认识all及其同系列的allexcept以及allselected函数。这些函数在与calculate搭配时,起到的是前述的第三种筛选(调节器)的作用,是对筛选器的调整。这些函数常被用来计算指定维度上的总计值,进而实现占比等运算。
ALL 移除筛选
ALL函数用于返回表中的所有行或列中所有值,同时忽略可能已应用的所有筛选器,语法如下:
ALL(表名/字段名,字段名,字段名……)
其作用是:
all(表名)返回该表所有行;all(字段名)返回该字段的所有非重复值;
All函数既可以生成一个表、也可以在calculate中移除指定的筛选器,本节中我们将主要介绍它作为调节器的作用,作为表的应用未来会在filter等函数时提到。
使用ALL函数作为calculate调节器时,表示移除直接作用于对应表/列上的筛选器。
仍以之前在介绍时间智能函数时使用的数据模型为例,下表中行中是日期表的月份和周数,第一列为sum('数据表'[期间指标]),底表中每天的值都是1,所以1、2月分别是31和28,3月底表数据只到9日,所以是9。
其余几个加了all前缀的指标,均是在该求和的逻辑之上使用了不同的all条件形成的:
几个度量值的公式如下:
all日期表 = CALCULATE(sum('数据表'[期间指标]),all('日期表')) all周数 = CALCULATE(sum('数据表'[期间指标]),all('日期表'[周数])) all月份名 = CALCULATE(sum('数据表'[期间指标]),all('日期表'[月份简写])) all月份 = CALCULATE(sum('数据表'[期间指标]),all('日期表'[月份]))
下面我们来解释一下在计算过程中发生了什么:
- all日期表:我们在calculate中使用all('日期表'),移除了作用于日期表上的所有筛选器。所以不论行值中传入了什么样的月份和周数,其计算结果都是全量的和68;
- all周数:该度量值中只移除了周数字段上的筛选,所以在月份起作用的行上仍能统计出当月的总和,但到了具体的每一周,由于筛选失灵了,所以只受当前月份筛选器的影响,得到的是对应月份的总和;
- all月份名:这里我们移除了月份英文简写的筛选,但事实上这个列目前并没在视觉对象中应用,因此度量值完全未受到影响,跟直接求和效果相同;
- all月份:此时,我们移除的筛选是行中已经使用的字段,因此我们可以看到,1、2、3月的汇总行中,求得的结果是忽略月份筛选后的总和即68,但在各周的对应行中,虽然移除了月份筛选、但周的筛选仍然在生效状态,所以各周的数据仍能正常统计。
这部分逻辑在初接触时比较不易理解,核心就是准确识别度量值所处的上下文,牢记all移除的直接作用的筛选器。
当我们需要移除同一个表中的多个列上的筛选时,可以按照all(列名1,列名2……)的样式来书写,如果需要移除多个表上的筛选器,那么就应该分别写对应表的all条件,作为calculate中的多个参数用逗号分隔即可。
ALLEXCEPT 保留筛选
Allexcept函数用于移除表上除了指定列之外的所有筛选器,比较适合用于有多个筛选器共同作用的场景。其语法为:
allexcept(表名,字段名1,字段名2…)
例如我们可以看到,在按周统计指标时,有时同一个周会跨越两个月份,例如下图中的第6周,那么能否让两个月份中第6周都能统计完整呢?新建度量值如下:
allexcept周 = CALCULATE(sum('数据表'[期间指标]),ALLEXCEPT('日期表','日期表'[周数]))
该度量值的含义是移除日期表中除了“周数”字段外的所有筛选,在图中可以看到,第6周在两个月均统计到了7。可能我们会觉得,这不是跟前面写过的all月份一样吗?确实在当前这个简易的模型中,两种写法实现了相同的效果,但假设我们的模型中还有许多别的维度,那么使用allexcept会更安全和直观,也会比在all中连续地写一连串字段要方便得多。
同理,在allexcept中如果传入多个字段,则代表只保留这若干个字段上的筛选。
可能有同学会提出,现在这种写法,在各个月份上的统计值是错误的,这种情况该怎么办呢?这时就涉及了如何判断所属的统计层级并选择不同的计算逻辑了,这些在接下来讲到判断函数时会涉及。
ALLSELECTED
Allselected 函数与all类似,同样是排除指定的表或列上的筛选器,但区别是它在移除筛选器时,会保留如切片器等来自外部的对该列的筛选效果。如下图所,新建一个度量值:
allselect 月 = CALCULATE(sum('数据表'[期间指标]),ALLSELECTED('日期表'[月份]))
在外部没有任何筛选时,可以看到它的效果与all月份是一样的,返回了整表的数据。
那么当我们选中1月和3月,可以看到all月份的度量值仍然计算了全表,而allselect则仅计算了选中的这两个月。
allselected的使用不是非常频繁,但它能应对需要对捕捉外部交互的场景,因此至少应该有所了解,即使没有记住,在需要用到时候再学习也不迟。