工坊实验室 | CALCULATE 的嵌套使用

前言:
研究DAX函数不能抱着轻视它的心态,DAX简约而不简单,它的设计使得用户上手速度很快,但是要深入掌握一种函数的原理还是需要一定的耐心,投入相当的精力。

课 题 背 景

有时在表达式中我们会嵌套使用多个Calculate函数,多层条件之间的相互作用让很多小伙伴感到困惑,多层条件的叠加结果是取交集呢还是取并集呢,今天我们就来研究一下

01数据准备

file

为了方便理解和解读实验结果,我们准备了非常简单的数据。一种商品系列的销售额,该商品系列有三种颜色——Red、Yellow、Blue,三种颜色分别对应一个销售额。

02尝试建模

我们构造如下几个度量值:

红色系列的销售额:

 Sales of Red =
CALCULATE ( SUM( Sales[Sales] ), 'Sales'[Color]= "Red" )

红黄系列的销售合计:

Sales of Red andYellow =
CALCULATE (
    SUM ( Sales[Sales] ),
    'Sales'[Color] = "Red"
        ||'Sales'[Color] = "Yellow"
)

红蓝系列的销售合计:

 Sales of Red and Blue = 
CALCULATE (
    SUM ( Sales[Sales] ),
    'Sales'[Color] = "Red"
        ||'Sales'[Color] = "Blue"
)

以上三个表达式的形式是我们在平时的建模工作中经常用到的形式。三个表达式在可视化界面的结果如下所示:
file

03深化建模

我们构造两种嵌套的场景:
两个Calculate条件嵌套使用,内层选择红黄系列,外层选择红蓝系列

 Sales of Red andYellow ?? =
CALCULATE (
    CALCULATE (
        SUM( Sales[Sales] ),
        'Sales'[Color]= "Red"
            || 'Sales'[Color]= "Yellow"
    ),
    'Sales'[Color] = "Red"
        ||'Sales'[Color] = "Blue"
)

内层表达式使用Keepfilters函数的嵌套,仍然是内层选择红黄系列,外层选择红蓝系列

 Sales of Red !! =
CALCULATE (
    CALCULATE (
        SUM( Sales[Sales] ),
        KEEPFILTERS( 'Sales'[Color] = "Red"|| 'Sales'[Color]= "Yellow" )
    ),
    'Sales'[Color] = "Red"
        ||'Sales'[Color] = "Blue"
)

两个表达式的结果如下
file

[Sales of Red and Yellow??]表达式完全采用了内层的筛选结果,这里需要提一下Calculate内外层筛选表达式的作用顺序,外层首先起作用,然后是内层。这里内层和外层作用于同一列且条件冲突,于是后起作用的内层筛选将原条件覆盖了。
[Sales of Red !!]表达式采用了内层和外层取交集“红色系列”的结果,原因是外层筛选首先起作用,筛选了红蓝系列,内层由于Keepfilters函数的作用,不是直接覆盖原条件,而是取内外层条件的交集,最终得到红色系列产品销售额。

04总结

Calculate函数在嵌套使用的时候作用顺序是由最外层到最内层,如果内层筛选条件有与外层筛选条件作用于同一列且冲突的,则内层筛选覆盖外层筛选条件;
Keepfilters函数改变Calculate的筛选条件作用机制,不是直接覆盖原筛选上下文,而是基于原来的上下文添加新的条件,产生的结果是多个条件取交集。

本期内容就是这些,小伙伴们下期再见!

  • PowerPivot工坊原创文章,转载请注明出处!

    如果您想深入学习微软Power BI,欢迎登录网易云课堂试听学习我们的“从Excel到Power BI数据分析可视化”系列课程。或者关注我们的公众号(PowerPivot工坊)后猛戳”在线学习”。


长按下方二维码关注“Power Pivot工坊”获取更多微软Power BI、PowerPivot相关文章、资讯,欢迎小伙伴儿们转发分享~

Power Pivot工坊