数据可视化之powerBI入门(十二)PowerBI中最重要的函数:CALCULATE
https://zhuanlan.zhihu.com/p/64382849
介绍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案例”下载
数据可视化之powerBI入门(十二)PowerBI中最重要的函数:CALCULATE的更多相关文章
- 数据可视化基础专题(十二):Matplotlib 基础(四)常用图表(二)气泡图、堆叠图、雷达图、饼图、
1 气泡图 气泡图和上面的散点图非常类似,只是点的大小不一样,而且是通过参数 s 来进行控制的,多的不说,还是看个示例: 例子一: import matplotlib.pyplot as plt im ...
- C# 互操作性入门系列(二):使用平台调用调用Win32 函数
好文章搬用工模式启动ing ..... { 文章中已经包含了原文链接 就不再次粘贴了 言明 改文章是一个系列,但只收录了2篇,原因是 够用了 } --------------------------- ...
- [转]C# 互操作性入门系列(二):使用平台调用调用Win32 函数
传送门 C#互操作系列文章: C# 互操作性入门系列(一):C#中互操作性介绍 C# 互操作性入门系列(二):使用平台调用调用Win32 函数 C# 互操作性入门系列(三):平台调用中的数据封送处理 ...
- (转)SpringMVC学习(十二)——SpringMVC中的拦截器
http://blog.csdn.net/yerenyuan_pku/article/details/72567761 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter, ...
- OpenJDK源码研究笔记(十二):JDBC中的元数据,数据库元数据(DatabaseMetaData),参数元数据(ParameterMetaData),结果集元数据(ResultSetMetaDa
元数据最本质.最抽象的定义为:data about data (关于数据的数据).它是一种广泛存在的现象,在许多领域有其具体的定义和应用. JDBC中的元数据,有数据库元数据(DatabaseMeta ...
- 第二十二章 跳出循环-shift参数左移-函数的使用 随堂笔记
第二十二章 跳出循环-shift参数左移-函数的使用 本节所讲内容: 22.1 跳出循环 22.2 Shift参数左移指令 22.3 函数的使用 22.4 实战-自动备份mysql数据库和nginx服 ...
- 《挑战30天C++入门极限》新手入门:关于C++中的内联函数(inline)
新手入门:关于C++中的内联函数(inline) 在c++中,为了解决一些频繁调用的小函数大量消耗栈空间或者是叫栈内存的问题,特别的引入了inline修饰符,表示为内联函数. 可能说到这里,很 ...
- 数据可视化之DAX篇(二十八)Power BI时间序列分析用到的度量值,一次全给你
https://zhuanlan.zhihu.com/p/88528732 在各种经营分析报告中,我们常常会看到YTD,YOY这样的统计指标,这样的数据计算并不难,尤其是在PowerBI中,因为有时间 ...
- [WebGL入门]十二,模型数据和顶点属性
注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中假设有我的额外说明,我会加上[lufy:].另外.鄙人webgl研究还不够深入,一些专业词语.假设翻译有误.欢迎大家指 ...
随机推荐
- 在kubernetes中搭建harbor,并利用MinIO对象存储保存镜像文件
前言:此文档是用来在线下环境harbor利用MinIO做镜像存储的,至于那些说OSS不香吗?或者单机harbor的,不用看了.此文档对你没啥用,如果是采用单机的harbor连接集群MinIO,请看我的 ...
- 列表、元组、字典和简单if语句【python实验1】
第一次实验报告: 学生姓名 总成绩 tom 90 jack 89 john 96 kate 86 peter 100 实验内容3-1 建立两个列表分别对学生的姓名和总成绩信息进行存储 name=['t ...
- 如何控制excel单元格录入相同内容的次数?
我们知道如果要用Excel制作让人规范填写的模板,数据有效性,Excel2013版本及以上叫数据验证是必学的技能,正好这个案例可以讲讲数据有效性的一种“高级”设置方法. 加入我们需要实现下面的要求,价 ...
- python工业互联网应用实战2—从需求开始
前言:随着国家工业2025战略的推进,工业互联网发展将会提速,将迎来一个新的发展时期,越来越多的企业开始逐步的把产线自动化,去年年底投产的小米亦庄的智能工厂就是一个热议的新闻.小米/华为智能工厂只能说 ...
- c++ UDP套接字服务器端代码示范
c++ UDP套接字服务器端代码示范 #include<winsock2.h> //包含头文件 #include<stdio.h> #include<windows.h& ...
- 如何从OutLook正确取得定期会议的时间?(待解决)
背景: 用Microsoft.Office.Interop.Outlook取得日历项,然后根据业务要求筛选. 现象: 如果是定期会议,使用AppointmentItem.Start/End取得的是该定 ...
- Oracle调用Java方法(上)如何使用LoadJava命令和如何将简单的Jar包封装成Oracle方法
最近在工作中遇到了遇到了一个需求需要将TIPTOP中的数据导出成XML并上传到FTP主机中,但是4GL这方面的文档比较少最终决定使用Oracle调用Java的方法,在使用的过程中发现有很多的坑,大部分 ...
- 35 _ 队列1 _ 什么是队列.swf
队列是一种可以实现一个先进先出的存储结构 什么是队列? 队列(Queue)也是一种运算受限的线性表.它只允许在表的一端进行插入,而在另一端进行删除.允许删除的一端称为队头(front),允许插入的一端 ...
- 30_栈的定义.swf
上面的局部变量 i int*p中的p指针变量,是在栈中分配的,malloc申请的内存是在堆中分配的,动态申请的都在堆中分配的. 栈是一种数据存储的结果,先进后出的数据结构.
- SSH网上商城四
第29课:10-SSH网上商城:购物模块的实体的封装 1.现在我们要实现购物车的模块,当用户在点击 加入购物车按钮的时候需要跳转到 上面我们需要对购物车的对象进行封装 上面一个商品就对应一个记录项,购 ...