我们有这样一张表:
我们用一个切片器绑定'奖金表'[奖金],就可以用表格来联动显示数据:
现在用户有个新的需求,当单选某个奖金时,需要统计小于这个奖金数的人数。
我用了一个度量值来统计:
度量值 =
VAR selected_bonus = SELECTEDVALUE('奖金表'[奖金])
VAR first = MIN('奖金表'[奖金])
VAR filter_items = FILTER('奖金表',
'奖金表'[奖金]>=first &&
'奖金表'[奖金]<selected_bonus)
RETURN
CALCULATE(COUNT('奖金表'[姓名]), filter_items)
然而结果却是显示空白
数据里明明有奖金小于3000的人,但是为什么统计不出来呢?
原因是因为切片器和表格都绑定了同一张表,所以表会自动根据切片器进行筛选。切片器把奖金不等于3000的数据都过滤掉了,这里当然统计不出来。
假如删除筛选,度量值又无法通过SELECTEDVALUE()去获取切片器的值。如此矛盾的情景,怎么办呢?
解决方法:
我们新建一个计算表‘奖金表2’,获取一个不带任何筛选的奖金表,然后再用它进行度量值的运算就可以解决了。
新建表:
奖金表2 = CALCULATETABLE('奖金表', ALL('奖金表'))
修改度量值,使用'奖金表2'去进行统计运算 (获取切片器值的方式不变)
度量值 =
VAR selected_bonus = SELECTEDVALUE('奖金表'[奖金])
VAR first = MIN('奖金表2'[奖金])
VAR filter_items = FILTER('奖金表2',
'奖金表2'[奖金]>=first &&
'奖金表2'[奖金]<selected_bonus)
RETURN
CALCULATE(COUNT('奖金表2'[姓名]), filter_items)
成功!
接着我们再更改下需求,我们添加一个部门列
然后再添加一个可以多选的部门切片器。将两个切片器的交互修改为互不筛选。
我们希望在保持奖金切片器的筛选逻辑不变的情况下,只统计选中部门的人数
这时我们发现统计人数又是空白了。
原因是我们的计算表是返回无任何筛选的表(ALL),所以解决方法是,我们在内部筛选里加上对部门的筛选即可:
度量值 =
VAR selected_bonus = SELECTEDVALUE('奖金表'[奖金])
VAR first = MIN('奖金表2'[奖金])
VAR filter_items = FILTER('奖金表2',
'奖金表2'[奖金]>=first &&
'奖金表2'[奖金]<selected_bonus &&
'奖金表2'[部门] IN VALUES('奖金表'[部门]))
RETURN
CALCULATE(COUNT('奖金表2'[姓名]), filter_items)
但是修改后,发现统计人数仍然不对。
我们来检查一下,把度量值返回的值修改下,我们看看选中的部门是什么:
奇怪的是,我们明明选择了所有部门,但是得到的部门只有"销售部",因为我们另外选择了奖金=3000,而只有销售部的小陈才满足奖金=3000。虽然设置了切片器互不筛选,但是因为两个切片器都绑定的是一张表(如果这张表是由多张表合并查询的也不行,只要是一张表就不行),所以仍然进行了筛选。
我这里找到最简单的办法,就是再复制一张'奖金表_copy',一个切片器用'奖金表',一个切片器用'奖金表_copy'就行了:
测试正确:
RETURN
CONCATENATEX(VALUES('奖金表_copy'[部门]),[部门],",")
当然,这里用计算表'奖金表2'也是可以的,因为它是不带任何筛选的。
假如数据源是数据库,我们设计表时就把奖金,部门分别在两个表里。这样两个切片器绑定的是不同的表,就不会出现上面的问题。
比如: 奖金切片器 -> 'T_奖金表'
部门切片器 -> 'T_部门表'
哪怕'T_奖金表'是有'T_部门表'的合并查询也行,只要不是一张表就行。
完整代码:
度量值 =
VAR selected_bonus = SELECTEDVALUE('奖金表'[奖金])
VAR first = MIN('奖金表2'[奖金])
VAR filter_items = FILTER('奖金表2',
'奖金表2'[奖金]>=first &&
'奖金表2'[奖金]<selected_bonus &&
'奖金表2'[部门] IN VALUES('奖金表_copy'[部门]))
RETURN
CALCULATE(COUNT('奖金表2'[姓名]), filter_items)
本人是powerbi新手,如果大家有更好的解决方法,也欢迎在评论区留言,大家共同学习。