PowerBI 度量值不被切片器筛选

我们有这样一张表:

我们用一个切片器绑定'奖金表'[奖金],就可以用表格来联动显示数据:

现在用户有个新的需求,当单选某个奖金时,需要统计小于这个奖金数的人数。

我用了一个度量值来统计:

度量值 = 
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新手,如果大家有更好的解决方法,也欢迎在评论区留言,大家共同学习。

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值