简介:《DAX权威指南》第二版英文原版PDF,由Marco Russo与Alberto Ferrari合著、微软授权Pearson出版,面向数据分析师、商业智能开发者及使用Power BI、SQL Server Analysis Services与Excel构建分析方案的技术人员,帮助系统掌握DAX数据建模与计算语言。全书从DAX基础语法、表函数与求值上下文讲起,深入CALCULATE、SUMX、FILTER等核心函数、表间关系与多对多建模、上下文转换等高级特性,并覆盖查询性能优化、最佳实践与真实案例研究,兼顾入门学习与进阶查阅。资源包共1个PDF文件,约13.03MB,内容完整、便于本地检索与离线阅读。目前已有827人学习下载,适合希望从函数用法走向模型设计与性能调优的读者按章节精读并反复查阅。
1. DAX 知识地图:从公式语言到引擎优化的四层结构
很多人第一次翻开《DAX权威指南》第二版,会被 20 章、700 多页的体量劝退,觉得这是一本“函数字典”。真正梳理下来会发现,它其实是一张四层结构的知识地图:最底层是数据模型与关系方向,往上是计算列、度量值与求值上下文,再往上是 CALCULATE、上下文转换、时间智能与计算组这类核心机制,最顶层才是 DAX 引擎、VertiPaq 存储与查询计划优化。前六章打地基,中间八章练内功,最后六章讲性能黑匣子。这份原版英文 PDF 的价值不在于教你背函数,而在于把 Power BI、SQL Server Analysis Services 和 Excel 三端共用的这套语义讲透。适合已经能写几个度量值、但一遇到上下文转换就翻车的人系统复习,也适合备考 BI 相关认证时当主线教材对照查漏。
2. 基础层:数据模型、语法与计算列度量值
2.1 数据模型与关系方向是全书地基
第 1 章开篇没有直接讲函数,而是先讲数据模型和关系方向,这个顺序很值得注意。DAX 的所有计算都发生在模型之上,关系是筛选传播的通道,方向决定了筛选能不能从一端流到多端。梳理下来,基础层要抓住三件事:表与表之间是一对多还是多对多、交叉筛选方向是单向还是双向、以及事实表与维度表的角色划分。书中用 Excel 用户、SQL 开发者、MDX 开发者三类背景做类比,本质是在说明 DAX 是函数式语言,不是单元格公式的简单升级。单元格思维会让你写出引用整列的度量值,而表思维才会让你理解 FILTER 返回的是一张表而不是一个值。这一章的重点不在记忆,而在把“模型先行”的习惯建立起来,后面所有上下文问题都能回溯到这里。
2.2 语法、数据类型与错误处理
第 2 章进入语法细节,覆盖数据类型、运算符、表构造器、条件语句、变量、错误处理与代码格式。这一章看起来琐碎,却是最容易在复习时被跳过、考试时被扣分的地方。DAX 的数据类型只有少数几种,但隐式转换规则很微妙,文本与数字混算、日期与整数混算都可能触发转换错误。错误处理部分讲了转换错误、算术错误、拦截错误和主动生成错误,实际写度量值时最常见的翻车就是除零和空值参与运算。代码格式那一节也别轻视,缩进和换行不是审美问题,而是让你在嵌套 CALCULATE 时还能看清括号层级。下面这段示例把变量、错误拦截和格式习惯放在一起,可以当作复习模板:
-- 安全除法:先判断分母,再决定返回结果 SafeRatio := VAR Numerator = SUM ( Sales[Amount] ) VAR Denominator = SUM ( Sales[Quantity] ) RETURN IF ( Denominator = 0 || ISBLANK ( Denominator ), BLANK (), -- 分母为零或空时返回空,避免除零错误 DIVIDE ( Numerator, Denominator ) )这段代码的关键不在 DIVIDE 本身,而在 VAR 先把分子分母各算一次,再用 IF 做前置判断。参数说明:Sales[Amount]是金额列,Sales[Quantity]是数量列,BLANK()返回空值而不是零,避免图表上出现误导性的 0。复习时要能说清 DIVIDE 与直接除号的差别:前者自带分母为零的兜底,后者会直接报错。计算列与度量值的区别也要在这一章钉死:计算列在刷新时逐行求值并占用内存,度量值在查询时按上下文聚合、不占存储。很多人把该做成度量值的逻辑写成计算列,模型体积暴涨,这就是基础层没打牢的典型症状。
2.3 聚合器与迭代器的分工
第 2 章后半段引入聚合器与迭代器,这是 DAX 函数体系的第一道分水岭。聚合器如 SUM、AVERAGE 直接吃一列,迭代器如 SUMX、AVERAGEX 先逐行求表达式再聚合。复习时可以用一张对比表把两者的适用场景固定下来:
| 类型 | 代表函数 | 输入 | 求值方式 | 典型场景 |
|---|---|---|---|---|
| 聚合器 | SUM、MIN、MAX | 单列 | 对整列聚合 | 简单求和、极值 |
| 迭代器 | SUMX、AVERAGEX | 表 + 表达式 | 逐行求值后聚合 | 行级乘法再汇总、加权平均 |
重点在于:迭代器会创建行上下文,而聚合器不会。这个差别在第 4 章会被放大成整个求值上下文体系,所以基础层就要把“谁创建行上下文”记牢。易错的地方是把 SUMX 写成 SUM 的等价物,忽略了表达式里可以引用多列甚至调用度量值,这正是迭代器威力的来源。
3. 核心机制:求值上下文、CALCULATE 与上下文转换
3.1 筛选上下文与行上下文的分工
第 4 章是全书第一个真正的难点,求值上下文。筛选上下文来自报表切片器、行标题、关系传播以及 CALCULATE 的参数,它决定当前计算“看到哪些行”;行上下文来自迭代器和计算列,它决定“当前是哪一行”。两者最容易被混为一谈,因为它们在简单场景下结果常常一样。梳理下来要记住一条铁律:行上下文不会自动筛选模型,只有通过关系或上下文转换才会变成筛选。书中用 SUM 在计算列里、列在度量值里、迭代器嵌套行上下文等例子反复测试这个理解,EARLIER 的出现就是为了在嵌套行上下文里引用外层当前行。复习时如果 EARLIER 让你头晕,说明行上下文的栈式理解还没建立,建议回到“同一张表嵌套两层行上下文”那个例子手推一遍。
3.2 CALCULATE 的求值顺序与修饰符
第 5 章围绕 CALCULATE 和 CALCULATETABLE 展开,这是 DAX 里权限最大、也最容易写错的函数。CALCULATE 做三件事:把行上下文转换成筛选上下文、用参数创建或覆盖筛选、按特定顺序求值。书中专门讲了求值顺序,因为多个筛选参数之间不是简单叠加,而是有覆盖与合并的规则。KEEPFILTERS 用来保留原有筛选而不是替换,USERELATIONSHIP 用来在计算时切换生效的关系,CROSSFILTER 用来临时改变交叉筛选方向,ALL 系列用来清除筛选。这些修饰符的差别用一张表记最省事:
| 修饰符 | 作用 | 常见误用 |
|---|---|---|
| KEEPFILTERS | 与现有筛选取交集 | 以为它等价于不加修饰 |
| USERELATIONSHIP | 指定本次计算用哪条关系 | 忘记关系必须已存在 |
| CROSSFILTER | 临时改筛选方向 | 双向筛选滥用导致歧义 |
| ALL | 清除指定表或列的筛选 | 在度量值里误清整表 |
重点难点在上下文转换:CALCULATE 会把当前行上下文转成等价的筛选上下文,这个机制让度量值可以在迭代器里按行工作。计算列里的上下文转换和度量值里的上下文转换行为不同,书中分开讲是有原因的,复习时要能各举一例。百分比计算是检验 CALCULATE 理解程度的经典题型,分子用当前筛选、分母用 ALL 清除筛选,写不对基本就是筛选覆盖顺序没搞清。
3.3 变量、迭代器与 CALCULATE 的组合
第 6、7 章把变量和迭代器接进来。变量的两个性质必须记死:变量一旦赋值就是常量,不会随后续上下文变化;变量的作用域限于定义它的表达式。惰性求值意味着变量只在被引用时才计算,这会影响性能也影响副作用。表变量可以存下一张中间表,配合 CALCULATE 做复杂筛选。迭代器与 CALCULATE 组合时,迭代器提供行上下文,CALCULATE 在内部做上下文转换,于是每一行都能拿到属于自己的筛选结果。常见模式是先用 VAR 存下基础聚合,再在 RETURN 里做比率或排名。这里最容易忽略的是迭代器的基数:迭代一张百万行的表再逐行调用 CALCULATE,性能会明显下降,复习时要把“先缩小表再迭代”当成默认习惯。
4. 进阶模块:时间智能、计算组、层级与高级关系
4.1 时间智能计算的成立条件
第 8 章时间智能是 Power BI 用户最常搜的模块,但它有严格前提:必须有一张标记为日期表的维度表,必须与事实表建立有效关系,日期列必须连续无缺口。YTD、MTD、同比、环比这些计算本质上都是对日期筛选的平移,函数只是把平移逻辑封装好。复习时要区分“按自然日期平移”和“按财年平移”,前者用标准时间智能函数,后者往往要配合自定义日期表列。计算组在第 9 章出现,它把一组计算项挂到一个占位符上,让同一套时间逻辑复用到多个度量值,减少重复定义。计算组的重点是优先级和筛选传播,配错优先级会出现计算结果互相覆盖的玄学现象。
4.2 筛选上下文、层级与表函数的配合
第 10 到 12 章处理筛选上下文的高级用法、层级和表操作。层级部分讲父子层级与自然层级在 DAX 里的不同处理方式,ISINSCOPE 这类函数用来判断当前处于哪一层,做分层占比时离不开它。表函数部分覆盖 SUMMARIZE、ADDCOLUMNS、SELECTCOLUMNS 等构造中间表的工具,重点是理解它们返回的是表而不是值,必须配合迭代器或 CALCULATE 才能落到标量。第 13 章讲用 EVALUATE 编写查询,这是从“写度量值”跨到“写查询”的一步,DAX Studio 里调试全靠它。复习时可以把 EVALUATE 当成验证工具:任何怀疑上下文出问题的度量值,都可以拆成查询看中间表长什么样。
4.3 高级关系与高级计算
第 14 到 16 章是进阶区,高级 DAX 概念、高级关系和高级计算。高级关系涉及多对多、双向筛选、非活动关系、关系歧义,这些是模型设计层面的坑,不是函数能补救的。多对多关系要配合桥接表理解,双向筛选要警惕筛选环路。高级计算里会出现更复杂的上下文嵌套和表函数组合,复习策略是先保证第 4、5 章的理解没有漏洞,再往上叠,否则这里会变成纯记忆。梳理下来会发现,这一段的难点不在函数数量,而在模型设计与计算逻辑的耦合:关系配错,再漂亮的度量值也出不来正确结果。
5. 易错点清单:五个最容易翻车的地方
5.1 易错点一:把行上下文当成筛选上下文
为什么漏:简单场景下两者结果一致,让人误以为可以互换。怎么补:凡是迭代器内部引用列,先问自己“这个列值有没有变成筛选”,没有就用 CALCULATE 触发上下文转换,或者显式用 FILTER 构造筛选。
5.2 易错点二:CALCULATE 多参数顺序想当然
为什么漏:单个筛选参数时顺序无关,多个参数时覆盖与合并规则才显现。怎么补:把每个参数单独写成一个度量值验证结果,再逐步合并,观察哪一步筛选被替换而不是叠加。
5.3 易错点三:时间智能缺日期表前提
为什么漏:函数能写出来、不报错,但结果偏移错位。怎么补:检查日期表是否标记、是否连续、关系是否有效,先用简单 YTD 验证基线,再叠加复杂逻辑。
5.4 易错点四:计算列与度量值选错载体
为什么漏:两者语法相似,都能算出数。怎么补:问一句“这个结果需要按行存储还是按查询聚合”,需要行级持久化才用计算列,否则一律度量值,控制模型体积。
5.5 易错点五:忽略 VertiPaq 与查询计划
为什么漏:前 16 章都在讲语义,性能章节容易被当成选修。怎么补:至少读懂第 17 到 20 章的基本结论——列式存储、字典编码、VertiPaq 压缩、查询计划的扫描与聚合阶段,知道慢查询该看哪里,而不是盲目改公式。
6. 复习路线:按章节权重做查漏补缺
复习这份原版 PDF,不建议从第一页顺读到最后一页,而是按权重分配时间。基础层第 1 到 3 章占两成时间,核心机制第 4 到 7 章占四成,进阶模块第 8 到 16 章占三成,引擎与优化第 17 到 20 章占一成。核心机制权重最高,因为上下文和 CALCULATE 是后面所有章节的地基。下面这张表可以直接当复习进度表用:
| 阶段 | 章节 | 复习目标 | 自检方式 |
|---|---|---|---|
| 地基 | 1–3 | 模型、语法、表函数 | 能解释关系方向对筛选的影响 |
| 核心 | 4–7 | 上下文、CALCULATE、变量、迭代器 | 手写百分比与排名度量值 |
| 进阶 | 8–16 | 时间智能、计算组、层级、高级关系 | 用 EVALUATE 拆解中间表 |
| 优化 | 17–20 | 引擎、VertiPaq、查询计划 | 说清慢查询的排查顺序 |
具体做法是每复习完一个模块,挑一个自己写过的度量值做“反向拆解”:把它改写成 EVALUATE 查询,看每一步返回的表和筛选,确认自己理解的上下文和实际执行一致。遇到结果不对,先怀疑上下文转换和筛选覆盖,再怀疑函数本身。英文原版的好处是术语准确,CALCULATE、context transition、filter context 这些词在中文资料里常被意译得含糊,对照原文反而更容易建立清晰概念。我自己的血泪经验是:每次改完一个复杂度量值,都强制用 EVALUATE 把中间表跑一遍再交付,从那以后上下文类的翻车少了大半。希望这份梳理帮到你,把这本书当成地图而不是字典来用。
本文还有配套的精品资源,点击获取