理解CALCULATE | PowerBI星球

介绍DAX的时候,特别强调过一个重要的函数:CALCULATE,本文就来揭秘这个函数的计算原理以及它是如何影响上下文的。


CALCULATE的语法结构

语法:

CALCULATE(<expression>,<filter1>,<filter2>…)

  • 第一个参数是计算表达式,可以执行各种聚合运算

  • 从第二个参数开始,是一系列筛选条件,可以为空;如果多个筛选条件,用逗号分隔

  • 所有筛选条件的交集形成最终的筛选数据集合

  • 根据筛选出的数据集合执行第一个参数的聚合运算并返回运算结果

前文提到DAX函数可以更改外部上下文,现在通过实例来理解DAX中最精髓的函数CALCULATE的计算原理,并看看它是如何更改外部上下文的。

CALCULATE应用实例

导入下面这个产品明细表:

新建一个度量值求每种产品的数量:

产品数量 = COUNTROWS('产品明细')

因为每种产品的只有1行,所以求产品明细表的行数就相当于求各种产品的数量,把产品名称和该度量值拖拽入矩阵表,

这里外部上下文就是表格每行的行标签。

01 | 筛选条件为空,不影响外部上下文

现在开始用CALCULATE函数创建一个度量值:

产品数量1 = CALCULATE([产品数量])

只是用了第一个参数,筛选条件为空,因为没有内部筛选所以完全依赖外部上下文,出来的结果也和原度量值一致。

另外,介绍CALCULATE语法的时候说,第一个参数为聚合运算表达式,为什么这里没有用聚合函数而只用了一个度量值呢?这是因为度量值[产品数量]本身就是一个聚合函数运算,实际上度量值[产品数量1]等同于这个:

产品数量1 = CALCULATE(COUNTROWS('产品明细'))

DAX函数可以直接引用已经创建好的度量值,可以使DAX函数看起来更简洁、更具可读性,这也是建议从最简单的度量值开始建的原因。

02 | 添加限制条件,缩小上下文

建一个度量值[产品数量2],

产品数量2 = CALCULATE([产品数量],'产品明细'[品牌]="苹果")

发现只有苹果的产品计数显示出来,而其他品牌的数据没有了,这是因为CALCULATE的第二个参数的限制,只筛选品牌为“苹果”的,限制了外部的上下文,非苹果的产品都不再运算。

03 | 结合ALL函数,扩大上下文

新建度量值[产品数量3],

产品数量3 = CALCULATE([产品数量],ALL('产品明细'))

这次的数据居然是所有产品的数量,这是因为筛选条件使用了ALL函数,ALL('产品明细')的意思是清除产品明细表里的所有筛选,外部筛选器不起作用了,每行统计的都是该表中的所有产品。

每行的数据都是9,你可能觉得这个ALL函数没什么用,运算的数据没有什么意义,会误导人,实际上当然不是这样,这个数据使用的地方非常多,比如我们想计算每个产品数量占总产品数量的比重,直接写个度量值:

产品占比=[产品数量]/[产品数量3]

产品占比就计算出来了,这就是统计总数的一个功能。

04 | 重置上下文

新建度量值[产品数量4],

产品数量4 = CALCULATE([产品数量],
                    all('产品明细'[产品名称]),
                    '产品明细'[类别]="手机")

先用ALL函数清除外部上下文,然后又新增了一个筛选条件,类别为"手机"的产品数量,那么结果会是什么样的呢,

每一行产品的数量都是3,正好符合建立这个度量值的逻辑,被ALL清除行标签的外部筛选后,从全部产品中统计品类为"手机"的产品的数量,所以每行都返回3.

通过以上几个简单的例子,可以领会到CALCULATE的计算逻辑,通过从第二个参数开始的筛选条件,得到一个数据集合,并利用第一个参数执行聚合运算,这不就是DAX要实现的功能:提取有用数据并执行聚合运算吗,所以说CALCULATE几乎就是DAX本身,它就是实现DAX功能的引擎,并能灵活的操控外部上下文,后面的数据分析也都离不开CALCULATE的身影。


案例数据请回复“CALCULATE案例”下载

提升技能 开拓视野

(0)

相关推荐

  • Calculate计值流,DAX最重要知识点,没有之一!【兼5月送书福利】

    - 1 - 所有对Calculate函数的疑问,几乎全都跟它的计值流有关系. 首先,看一个群里朋友问的问题:求各菜品名称的最大日期对应的销售量.  1.为什么先写好度量[最大日期],然后在Calcul ...

  • PowerBI公式

    高级筛选器 Filter函数 度量值工作的两大核心步骤是筛选和计算,筛选函数是制定计算的范围,聚合函数的用途是计算.如果你能够领悟第一阶段学习的筛选和聚合共10个函数以及上下文的概念,你就掌握了度量值 ...

  • PP-DAX:如何实现模糊匹配的动态计算?

    这是群里朋友提的一个问题:用CALCULATE函数写动态度量值的时候,是否可以计算包含某个文本的内容? 当然,Power Pivot里是不支持使用*号作为通配符的.所以,需要换个方法,比如,以前我们讲 ...

  • PP-DAX入门:无动态,不智能——谈谈DAX函数的计算环境(筛选上下文)问题

    小勤:BI(商务智能)到底有什么不一样啊?倒来倒去到最后不也是出一堆的图或表吗?Excel里不也可以弄吗? 大海:对的,Excel里当然也可以做图表,而且还能做得很漂亮,而且可以做得很个性化,但你有没 ...

  • Power BI Desktop 中的 DAX 基本概念

    在 Power BI Desktop 中应用 DAX 的基础知识 2019/10/21 M o 本文适用于刚开始使用 Power BI Desktop 的用户. 为你提供有关如何使用数据分析表达式 ( ...

  • PP-DAX入门:传统数据透视无法实现的按条件计数问题

    小勤:我要统计每栋楼的楼层情况和单元数,但楼层里有走廊的不能统计,这种情况怎么办? 大海:加个辅助列将楼层的情况做个判断,然后用辅助列的数据做透视? 小勤:最好不要辅助列,不然的话我每次接到表都得重新 ...

  • DAX进阶-死磕Calculate之1:改变筛选上下文之忽略(”删“)

    小勤:在文章<DAX入门:无动态,不智能--谈谈DAX函数的计算环境(筛选上下文)问题>里提到,默认情况下度量的计算是随着计算环境(筛选上下文)的选择而动态变化的,但有时候就是需要一些不变 ...

  • DAX进阶-死磕Calculate之2:改变筛选上下文之选择性忽略

    小勤:大海,上次将Calculate改变筛选上下文,忽略(删)现有筛选器的作用时,都是整个表或整个字段都不起作用了,如果我只是希望忽略某个字段中的一部分内容呢?比如下面这个,我想看看某个产品在我选择的 ...

  • DAX进阶-ALL函数的理解雷区!

    在文章<死磕Calculate之1:改变筛选上下文之忽略("删")>里,我说"把筛选上下文给去掉(删),用All函数",如下所示: 这里面,可能强调 ...

  • 度量值 | PowerBI星球

    本文学习PowerBI最重要的概念:度量值 初学Power BI一般都会对度量值比较困惑,毕竟对长期接触Excel的人来说,这是个全新的概念,但一旦理解了她,肯定会立即喜欢上. 简单来说,度量值是用D ...

  • DAX是什么? | PowerBI星球

    DAX是英文Data Analysis Expression的缩写,意思是数据分析表达式,从名称上就可以看出,DAX公式是用作数据分析的,事实上也确实如此,从数据分析层面认识DAX会更有助于我们理解它 ...

  • FILTER函数 | PowerBI星球

    介绍过CALCULATE函数之后,有必要再介绍它的最佳搭档:FILTER函数. CALCULATE函数的第二个及之后的参数是筛选条件,而FILTER函数正是为筛选而生. FILTER语法 FILTER ...

  • EARLIER 函数 | PowerBI星球

    前面利用PowerBI做数据分析的时候都是对整列的字段进行操作,并没有做更细化的分析,比如分析数据的每一行.提取某一行的数据,这在Excel中很容易实现,因为Excel公式是对单元格操作.那么在Pow ...

  • 普通到没颜值的柱形图?| PowerBI星球

    前面通过大量时间学习那些可能会让你感觉枯燥的数据处理.数据建模等内容,到这里我们开始涉足PowerBI中最让人心动的环节:数据可视化. 第一篇先在PowerBI中制作常见的柱形图,简单来说,柱形图就是 ...

  • 折线图 | PowerBI星球

    如果要展现数据的趋势变化,折线图应该是不二之选,并且它更擅长于展现时间序列下的数据,根据折线斜率的不同展现变化的速率. 同柱形图一样,折线图同样很大众化,每个人都见过,这本身也成了它的一个优势,就是非 ...

  • 面积图 | PowerBI星球

    面积图主要是反映各类别数据变化的趋势以及占比情况.在PowerBI默认的可视化对象中,有两种面积图:分区图和堆积面积图. 分区图 分区图是一种标准的面积图,下面用分区图来展现每天各种渠道的点击量变化趋 ...

  • 饼图 | PowerBI星球

    饼图同样是最受欢迎和易于理解的图表之一,在各种媒体上经常可以见到这种图表,比如在经济学人网页上看到的饼图: 这是最标准的饼图,展现的是个体占总体的比例,利用扇面的角度来展示比例大小. 在PowerBI ...

  • 散点图 | PowerBI星球

    使用可视化的目的就是想从大数据中发现规律,而散点图就是专门做这个的. 散点图号称是最多才多艺的图表,它可以让一大堆令人困惑的散乱数据变得通俗易懂,并能让你从这些庞杂数据中发现一些表面上看不到的关系,更 ...