源数据很简单为销售表格,其中有省份字段和金额字段,现在想在一张表格中显示每个省份的销售金额以及每个省份与北京销售的差距(预览效果如下):
主要探讨实现BJ_Actual的几种方式及各自之间的差别
- 方法一:Calculate函数
BJ_Actual =
CALCULATE(
[Actual],
'省份区域'[省份]="北京"
)
- 方法二:Calculate+filter+all
BJ_Actual_equal =
CALCULATE(
[Actual],
filter(
all('省份区域'[省份]),
[省份]="北京"
)
)
BJ_Actual_equal2 =
CALCULATE(
[Actual],
filter(
all('省份区域'),
'省份区域'[省份]="北京"
)
)
- 方法三:
BJ_Actual2 =
CALCULATE(
[Actual],
filter(
'省份区域',
'省份区域'[省份]="北京"
)
)
结论:
- 方法一与方法二实质是一样的,方法二相当于方法一的简单书写方式,实质的运作模式其实与方法一一致,即计算的结果剔除了表格中省份作为筛选上下文的筛选,因此在表格中每个省份对应的只是北京的金额
- 方法三与方法一和二是有很大区别的,关键在于filter函数中,一个有all的限制,剔除了表格中筛选上下文的筛选,一个没有,因此保留表格的筛选上下文的筛选,因此只有当北京被筛选时,方法三才会出现北京的值,其他省份均不会出现北京的值(其他省份为空值)
补充思考点:
-
需要更深入了解在表格中放入度量值后,度量值中的计算和表格筛选的系统运行先后顺序
-
在方法二中看似两个表达式的结果一样,但还是在运算效率和逻辑上有一定的区别,逻辑上,第一种filter筛选出来的只是省份这样的一个单列,而第二种filter筛选出来的是整张表格,因此,从速率上来讲,第一种更快,但是第二种也有存在的必要性,如筛选条件中需要用到表中的其他列的时候,因此要根据具体的情况进行使用。
-
上述所有方法中的All都可以用REMOVEFILTERS函数代替,效果完全一致。