ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 1279|回复: 7

[原创] 上下文系列小讲堂(二)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-8-8 08:47 | 显示全部楼层 |阅读模式
东哥陪你学DAX
上下文系列小讲堂(二)
初识行上下文
在介绍两种上下文过程中,我会尽量列举它们在计算列和度量值中的不同表现,来增强大家的感性认识。(本系列所用示例,来自微软官方样本数据库AdventureWorks)
“行上下文”是怎么来的?
1. 创建计算列
2. 使用迭代器(以X结尾的函数)

先来看计算列
上表中,“利润”和“销售额”均为计算列
销售额 = [销量] * [单价]
利润 = [销量] * ([单价] – [成本])
对初学者来说,上述公式能得到正确结果,是天经地义,再正常不过了。因为EXCEL里的列计算就是这样,加减乘除结果怎么可能会错
上面这句话,只说对了一半
错在哪里?错就错在,我们把EXCEL的思维方式套在了DAX身上
在EXCEL里,对于列的计算,我们都是在首行单元格输入公式,通过下拉填充,得出全列结果。每个单元格的公式,除了运算符号不变,单元格引用都不同。该列的每一行,只使用当前行单元格来参与运算
而DAX是以列运算为主,整列就一个公式,怎样确保参与运算的都是当前行,而不会出现第三行销量第五行单价第八行成本算到一块儿去?
之所以整列计算结果都正确,恰恰因为“行上下文”的存在并起了关键作用
只要创建计算列,就会自动创建行上下文,无需手工干预。行上下文就是如来手掌,计算列的运算无论如何也跳不出去
就拿上面两个公式来说,计算列一旦创建,DAX立刻就从第一行开始迭代,同时也创建了一个包含当前行的行上下文并开始计算。计算动作发生之前,行上下文已锁定当前行,因此整列计算才不会出错
那要如何通过度量值来建立“行上下文”?
迭代器
迭代器其实就是迭代函数,末尾带字母X的函数都自备迭代功能,诸如SUMX,AVERAGEX,COUNTX,MAXX,MINX等
上图中,SUMX函数作为迭代器,将创建了一个“行上下文”,并对SUMX第一个参数“销售表”进行迭代,在行上下文中,执行SUMX的第二个参数(单价乘销量的表达式)。因此,在迭代过程中,每行表达式都明确知道自己应该用哪一行的销量和单价来运算

再重复一次:
为什么同样的表达式,在计算列里就能正确执行,而到了度量值里却不行?
因为计算列会自动创建行上下文,而度量值却不会
如果想在度量值内逐行计算该表达式,必须通过迭代函数来人为创建行上下文
还有一点需要注意,“行上下文”里的“行”,是针对数据模型里的表而言(后面会提到虚拟表的概念,虚拟表中也可以使用行上下文),而不是可视化元素下的表格和矩阵。前者是模型原表,后者是聚合后再被筛选过的数据容器。DAX无法直接引用后者的行或列,避免矫枉过正
行上下文入门小结:
1. 计算列和迭代函数都可以创建行上下文
2. 执行计算的行没有储存在公式内部,而是由行上下文定义
3. 行上下文只包含一行(基于行号,永远不会重复),并且在被创建时自动定义
4. 行上下文只用来决定引用目标列的哪个值(即确定计算发生在哪一行)
5. 表格的列并没有某个确定的值,列在表格每一行都有一个值,如果你想让列取得某个值,需要确定这个值所在的行,而确定行的唯一方式是使用行上下文
6. 要使用“行上下文”,要么通过计算列、要么通过迭代函数


(未完待续)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-9-1 15:29 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
感谢楼主教程,期待后续!

TA的精华主题

TA的得分主题

发表于 2020-10-18 20:39 | 显示全部楼层
非常感谢,最近一直为度量值和新建列在困惑,看了以后似乎有所收获。过段时间再看可能感受更深刻!

TA的精华主题

TA的得分主题

发表于 2020-10-27 17:12 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
继续。。。。。。。。。。。

TA的精华主题

TA的得分主题

发表于 2020-10-30 11:22 | 显示全部楼层
感谢楼主,看后有所悟。。。

TA的精华主题

TA的得分主题

发表于 2020-11-6 16:55 | 显示全部楼层
精辟,希望继续下去!!!

TA的精华主题

TA的得分主题

发表于 2021-11-29 17:02 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2021-11-30 14:00 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-25 19:06 , Processed in 0.044507 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表