数据可视化之DAX篇(十六)如何快速理解一个复杂的DAX?这个方法告诉你
https://zhuanlan.zhihu.com/p/64422393
经常有朋友提出一个问题,然后我给出一个DAX之后,TA又不是很理解,反复多次沟通才能把一个表达式讲清楚。或者TA自己写了一个度量值,可是对输出结果无法理解:我想要的是A,为什么出来的是B?
为了帮助大家快速理解一个相对复杂的DAX,我把平时使用的方法拿出来分享如下。
为了介绍的简洁清晰,以及大部分人的可理解性,本文的DAX并不算复杂,重要的是理解的步骤和思路。(我理解的复杂DAX就是看起来比较长的、经过多层函数嵌套的、计算逻辑较难理解的表达式)
DAX都应该有一个具体的应用场景,否则分析就没有意义。
假设已有一个订单表,需要匹配每个订单的产品对应的采购成本金额;而成本表中的每种产品的采购成本是随着时间变动的,成本生效以后,该产品销售订单的成本随之变化,两个表格结构如下图,

问题看似简单,其实需要匹配几个条件,要匹配产品名称、订单日期对应的成本生效区间。转换为数据分析语言,其实就是计算该产品的小于等于订单日期的最近一个成本生效日期对应的采购成本。
在订单表上"新建列",用DAX编写如下,
单位成本 =
CALCULATE(MIN('成本表'[成本金额]),
TOPN(1, FILTER(ALL('成本表'), '成本表'[生效日期]<=
EARLIER('订单表'[订单日期])&&
'成本表'[产品名称]=EARLIER('订单表'[产品名称])),
'成本表'[生效日期] ) )
然后每笔订单对应的单位成本就被计算出来了,

当然这篇文章并不是为了匹配成本,而是理解这个DAX表达式。
对DAX熟悉的人,看到上面这个表达式并不难,但是如果是接触DAX不是很久的同学,可能并没有那么容易理解。
下面进入正题,通过以下几个步骤来快速理解上述的DAX。
一 、格式化DAX
格式化就是对DAX进行合理的换行和缩进,表面上看起来更加简洁美观,更易于阅读,其实最重要的是通过格式化可以更清晰的找出该表达式的设计逻辑和计算逻辑。
上述的表达式进行格式化处理以后,变成了这样的,是不是很清晰很多呢。

当然当你看到的DAX已经是格式化的写法,就没有必要进行这一步了。
如果是你自己编写的DAX,强烈建议从一开始就养成按格式书写的好习惯,为以后进行数据分析编写更复杂的DAX打下基础。
上面这个表达式相对简单,如果比这复杂几倍,嵌套更多层的表达式,如果不进行格式化,想看懂其结构都非常困难,更别说理解其逻辑了。
二 、对DAX从内层向外逐层分解,不理解时通过输出,来查看其计算结果。
通过上面格式化后的表达式,可以看出最内层的算是EARLIER函数,然后是FILTER函数的筛选表,之外又套了一个TOPN函数,最后由CALCULATE函数返回最终结果。
理解DAX函数的用法和逻辑,除了看关于该函数的介绍文档,最直接的就是查看该函数的计算结果,下面就以一个实例来看看该DAX每一步的输出内容。
以2月8日手机订单对应的成本为例,来理解这个表达式是如何计算出单位成本为1300的。

第1层 | EARLIER函数
EARLIER函数之前介绍过(EARLIER 函数 | PowerBI星球),比较简单,返回当前行对应的参数列,实质就是返回本行和参数列交叉的单元格。
那么EARLIER的计算结果如下,
EARLIER('订单表'[订单日期])返回:2018-2-8
EARLIER('订单表'[产品名称]返回:手机
第2层 | FILTER函数
有了第1层的结果,FILTER函数的表达式变成了,
FILTER(ALL('成本表'), '成本表'[生效日期]<= DATE(2018,2,8)&&'成本表'[产品名称]="手机")
该表达式将筛选成本表中产品名称为手机,并且生效日期早于或等于2018年2月8日的数据,通过新建表,该表达式的输出结果如下:

回的正是按上述条件的筛选表。
第3层 | TOPN函数
FILTER函数的计算结果返回了早于订单日期的所有行,为了找出最近的一次生效日期,使用TOPN函数返回按生效日期排序的第1行,利用上一步的计算结果,TOPN的表达式变为,
TOPN(1,'表1','表1'[生效日期])
同样使用"新表"查看输出结果,

把小于订单日期的最近生效日期的所在行给筛选出来了。
第4层 | CALCULATE函数
经过TOPN的筛选,已经把成本表筛选的只剩下一行,在这一行中找采购单价已经非常简单了,表达式变为,
CALCULATE(MIN('表2'[采购单价]),'表2')
这里用了MIN函数,实际上用MAX函数也是一样的,因为只有一个值,最小值和最大值是相同的。
因为CALCULATE只能返回值,为了在表中查看输出结果,所以外面套一个{},强制把单个值变为表,结果如下:

得出了2月8日手机的采购成本价格1300元。
以上对几个嵌套函数的拆解,为了演示输出结果,所以生成了表1、表2、表3等三个中间表,实际上原表达式一气呵成,并不需要中间表,一次性输出最终数据。
三 、复盘总结各函数的用法
通过以上的拆解,应该能完全理解上述表达式的计算过程了,但我们不能仅理解了这个表达式,更是要通过整体的计算逻辑,能举一反三,掌握其中每个函数的用法,所以每次拆解以后,应该整体上进行复盘,思考一下表达式中主要函数的用法以及返回的结果是很必要的。
比如上述表达式中,至少可以总结出这些,
- EARLIER返回当前表的当前行与参数列交叉的单元格数据;
- FILTER函数根据第二个参数的筛选条件来筛选第一个参数表,返回的是一个表;
- TOPN函数返回参数表中按第三个参数排序的前N行,返回的也是一个表;
- CALCULATE函数返回聚合后的一个值。
经过以上的三个步骤的层层分解和复盘,不仅知道了DAX的输出结果,而且对每一个函数的计算逻辑和过程进行了全面理解。
上述DAX虽然简单,但即使是更复杂的表达式,通过以上的方式也都可以很快理解并掌握。
总结
通过以下几个步骤快速理解一个相对复杂的DAX,
1,格式化:从整体上查看其结构,为第2步打基础;
2,从内向外层层分解:必要时输出结果查看计算逻辑;
3,分解后再整体复盘:总结每一个函数和参数的用法。
本文示例文件可通过公众号回复关键字"理解DAX"获取,业务场景来自于知识星球中一个朋友的提问,来知识星球,和我一起学习PowerBI。
数据可视化之DAX篇(十六)如何快速理解一个复杂的DAX?这个方法告诉你的更多相关文章
- 数据可视化之分析篇(六)使用Power BI进行流失客户分析
https://zhuanlan.zhihu.com/p/73358029 为了提升销量,在不断吸引新客户的同时,还要防止老客户离你而去,但每一个顾客不可能永远是你的客户,不可避免的都会经历新客户.活 ...
- 数据可视化之PowerQuery篇(六)PowerQuery技巧:批量合并Excel表的指定列
本文来源于一个星友的问题,他有上百个Excel表格,格式并不完全一样,列的位置顺序也不同,但每个表都有几个共同列,这种情况下,能不能通过Power Query把这些表格共同的列批量合并呢? 当然是可以 ...
- 数据可视化之PowerQuery篇(四)二维表转一维表,看这篇文章就够了
https://zhuanlan.zhihu.com/p/69187094 数据分析的源数据应该是规范的,而规范的其中一个标准就是数据源应该是一维表,它会让之后的数据分析工作变得简单高效. 在之前的文 ...
- 数据可视化之powerBI入门(十一)认识Power BI数据分析语言DAX
DAX是英文Data Analysis Expression的缩写,意思是数据分析表达式,从名称上就可以看出,DAX公式是用作数据分析的,事实上也确实如此,从数据分析层面认识DAX会更有助于我们理解它 ...
- 数据可视化之 图表篇(二)如何用Power BI制作疫情地图?
丁香园制作的这个地图可视化,相信大家每天都会看好几遍,这里不讨论具体数据,仅来探讨一下PowerBI地图技术. 这个地图很简洁,主要有三个特征: 1,使用着色地图,根据数据自动配色 2,只显示中国地图 ...
- 数据可视化之powerBI技巧(十一)基于SQL思维的PowerBI DAX实战
本文来自于PowerBI星球嘉宾天行老师的分享,天行老师不仅DAX使用娴熟,更是精通SQL,下面就来欣赏他利用SQL思维编写DAX解决问题的一个实战案例. 基于SQL思维使用DAX解决实战问题 作者: ...
- 【WaaCaa】一款开源科学作图/数据可视化工具 —— 诞生篇
作为一个理工男.用过了形形色色能够用于科学作图/数据可视化软件:从大学时做实验课推荐用于分析简单採集数据的 Origin; 毕业论文时用来呈现实验时序信号和离线分析脑电信号的 MATLAB.后面还发现 ...
- 数据可视化之 图表篇(四) 那些精美的Power BI可视化图表
之前使用自定义图表,每次新打开一个新文件时,都需要重新添加,无法保存,在PowerBI 6月更新中,这个功能得到了很大改善,可以将自定义的图表固定在内置图表面板上了. 添加自定义图表后,右键>固 ...
- 数据可视化之powerBI技巧(六)在PowerBI中简单的操作,实现复杂的预测分析
时间序列预测就是利用过去一段时间内的数据来预测未来一段时间内该数据的走势,比如根据过去5年的销售数据进行来年的收入增长预测,根据上个季度的股票走势推测未来一周的股价变化等等. 对于大部分人来说,这是个 ...
随机推荐
- <VCC笔记> 关于Assertion
这篇博客开始介绍VCC的用法,先用简单的例子介绍VCC的基本语法,当然面对更复杂的程序时,VCC也是将他简化然后分析的. 1.Assertion #include <vcc.h> int ...
- 关于JSON数据体积优化的一点小心得
最近在做的一个项目里传输的json数据比较大,造成了线程间的卡顿,于是想优化一下json数据的体积. 可以看到在json文件里有很多无用的字段,这些字段占据了大量的存储空间. 对数据的结构作一下优化, ...
- 其他函数-web_get_int_property
用于记录http响应的信息.这个函数在调试脚本的常用,但是在实际压力测试中请将这些注释 使用这个函数可以获取到的信息有: 1.HTTP_INFO_RETURN_CODE:返回HTTP响应码 2.HTT ...
- 0.0---selenium+java自动化基础01---元素定位和操作
一.定位方法 1.通过ID定位元素:driver. findElement(By.id(value)); 2.通过元素的名称定位元素: driver. findElement(By.name( val ...
- Elasticsearch去重查询/过滤重复数据(聚合)
带家好,我是马儿,这次来讲一下最近遇到的一个问题 我司某个环境的es中被导入了重复数据,导致查询的时候会出现一些重复数据,所以要我们几个开发想一些解决方案,我们聊了聊,相出了下面一些方案: 1.从源头 ...
- 使用ssh连接数据库时出现Permission denied, please try again.解决方案
安装ssh(如果已经安装则会覆盖)sudo apt-get install openssh-server找到/etc/ssh/sshd_config这个文件 将permitrootlogin的值设置为 ...
- 使用Docker构建企业Jenkins CI平台
在如今的互联网时代,随着软件开发复杂度的不断提高,软件开发和发布管理也越来越重要.目前已经形成一套标准的流程,最重要的组成部分就是持续集成(Continuous Integration,CI)及持续部 ...
- Beta冲刺<9/10>
这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 Beta冲刺 这个作业的目标 Beta冲刺--第九天(05.27) 作业正文 如下 其他参考文献 ... B ...
- eclipse导入git项目
复制项目的git路径 Eclipse打开 Git Repostitories 视图 弹出show view窗口 选择ok ,进入git repositories 视图窗口 我这里已经导入从我的git仓 ...
- 痞子衡嵌入式:利用i.MXRT1xxx系列ROM提供的FlexSPI driver API可轻松IAP
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT系列ROM中的FlexSPI驱动API实现IAP. 痞子衡的技术交流群里经常有群友提问: i.MXRT中的FlexSPI驱动 ...