销售需求丨借贷记账法(补充)

小伙伴们,还记得之前的《销售需求丨借贷记账法》的文章么?当时的最后结果展示如下:

这个动图展示的就是最终的动态结果,但是很明显有点问题,就是当切片器没有选择任何对象的时候,数据模型会呈现错误的提示,这是什么原因造成的呢?
先来看看之前的代码:

借贷记账法 = 
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了么?

白茶会不定期的分享一些函数卡片

(文件在知识星球[PowerBI丨需求圈])

这里是白茶,一个PowerBI的初学者。

下面这个知识星球是针对有实际需求的小伙伴,有需要的请加入下面的知识星球。

请在PC端查看,有部分图片无法在移动端显示。
PowerBI丨白茶