小伙伴们,还记得之前的《销售需求丨借贷记账法》的文章么?当时的最后结果展示如下:
这个动图展示的就是最终的动态结果,但是很明显有点问题,就是当切片器没有选择任何对象的时候,数据模型会呈现错误的提示,这是什么原因造成的呢?
先来看看之前的代码:
借贷记账法 =
VAR HQ =
CALCULATETABLE (
VALUES ( '示例'[订单编号] ),
'示例'[项目名称] = ALLSELECTED ( '维度表'[项目名称] )
)
RETURN
CALCULATE ( SUM ( '示例'[金额] ), HQ )
这是之前采用的代码。其实不只是这一期,还有很多期的实际例子都存在这种情况:
当需要构建维度作为筛选条件,来为数据模型提供上下文进行计算的时候,都会遇到这个问题,就是无筛选状态下,没有数据来提供上下文,这就导致没有结果。那么该如何处理呢?
IN函数
IN函数本身是一个“逻辑”函数。按照微软的解释,当提供的标量值,在相对应的表格中至少有一行的情况,结果都是TRUE。什么意思?
比如说:**5 IN {5,15,25}**这个结果返回就是正确可以显示的,因为5在后面的表中;**10 IN {5,15,25}**这个结果返回就是错误的,因为表中没有符合10的选项。
这里有两种方法,方法1修改代码如下:
优化借贷记账法1 =
VAR HQ =
CALCULATETABLE (
VALUES ( '示例'[订单编号] ),
'示例'[项目名称] IN ALLSELECTED ( '维度表'[项目名称] )
)
RETURN
CALCULATE ( SUM ( '示例'[金额] ), HQ )
方法2代码如下:
优化借贷记账法2 =
VAR HQ =
CALCULATETABLE ( VALUES ( '示例'[订单编号] ), '示例'[项目名称] IN VALUES ( '维度表'[项目名称] ) )
RETURN
CALCULATE ( SUM ( '示例'[金额] ), HQ )
先来看看结果,白茶再解释代码:
上面两个图用的是之前的代码,下面三个图用的是修改之后的代码,小伙伴们看出来区别了么?这里面的关键就在于**“IN”与“=”的区别。“=”的情况下,需要提供一个具体的标量值。也就是说在非筛选状态下,等号右边的默认条件是“空”**,这种情况下数据模型肯定会报错。
“IN”的情况下,右边提供的是一个范围表。非筛选状态下,没有任何选项右边默认的条件是“整个表”,IN左边的选项肯定都包含在维度表里面,因为之前我们用VALUES提取的维度,那么结果返回就必然是TRUE的。
这就是提供值,与提供一张表的区别。
基本上当满足条件时,都可以使用IN函数:
1、非筛选情况下,左边的值全部在IN右边的表中有对应项目。
2、特别是根据需求自己构建维度的情况,基本都适用。
本期案例数据在下面的知识星球中,点击可加入白茶的星球。
小伙伴们,GET了么?
(白茶:Biu~❤)
这里是白茶,一个PowerBI的初学者。
下面这个知识星球是针对有实际需求的小伙伴,有需要的请加入下面的知识星球。
(这个星球里面有白茶之前所有的案例文件。)
ID:Storysming