DAX权威指南:从计算上下文到CALCULATE,彻底搞懂Power BI公式语言 简介《DAX权威指南》第二版英文原版PDF由Marco Russo与Alberto Ferrari合著、微软授权Pearson出版面向数据分析师、商业智能开发者及使用Power BI、SQL Server Analysis Services与Excel构建分析方案的技术人员。全书从DAX基础语法讲起深入数据模型与表间关系、CALCULATE与FILTER等核心函数、计算列与迭代表达式并覆盖多对多关系、上下文转换、查询性能优化与最佳实践配有多个真实案例适合希望系统掌握DAX建模与计算的初中级读者进阶。资源包共1个PDF文件大小约13.03MB为完整电子书正文便于离线阅读与按章节检索。目前已有827人学习下载可作为日常查阅DAX函数语义与建模思路的案头参考。1. 到底什么是 DAX一个让 Excel 老手也发懵的公式语言如果你用过 Excel大概率写过SUM(A1:A10)这种公式鼠标一拖结果就出来了。但当你第一次打开 Power BI想算一个「销售额占比」搜到的答案里赫然出现CALCULATE、FILTER、ALL这些词公式长得像天书写完还报错——这时候你遇到的就是 DAX。DAX 全称 Data Analysis Expressions中文一般叫「数据分析表达式」。通俗地说它是一门专门用来在数据模型上做计算的公式语言主要活跃在 Microsoft Power BI、SQL Server Analysis Services 表格模型和 Excel 的 Power Pivot 里。它和 Excel 公式长得像亲戚骨子里却是两套逻辑Excel 算的是单元格DAX 算的是表和列。这份《DAX 权威指南》第二版原版 PDF就是把这个「看着像 Excel、用起来完全不是一回事」的语言从基础语法一路讲到查询计划优化的完整参考书。搞懂它你才算真正摸到了 Power BI 计算能力的门槛。2. DAX 为什么让人又爱又恨它到底解决了什么问题2.1 从「单元格思维」切换到「表思维」Excel 用户最熟悉的动作是选中一个格子写公式往下拖。每个格子有自己的公式算的是自己那一行。DAX 不是这样。DAX 的公式写在「度量值」里一个度量值只有一份定义却要在你拖进图表的每一个维度组合下都算出正确结果。换句话说你写的不是「这一格等于什么」而是「这一类格子都该怎么算」。打个比方Excel 像是你亲手给每个学生写一张成绩单DAX 像是你写一套评分规则然后学校按班级、按科目、按学期自动套用这套规则生成所有成绩单。规则只有一份但要在无数种筛选组合下都成立——这就是 DAX 的核心难点也是它强大的地方。书里第 1 章专门对比了 DAX 对 Excel 用户、SQL 开发者、MDX 开发者的不同心智模型。对 Excel 用户最大的坎是「单元格 vs 表」对 SQL 开发者最大的坎是「DAX 是函数式语言不是声明式查询」对 MDX 开发者则是「多维模型 vs 表格模型」的差异。认清自己从哪来才知道该补哪块认知。2.2 它为什么必须存在计算要跟着筛选走有人会问Excel 公式也能算占比、算同比为什么还要另造一门语言原因在于数据模型的规模和使用方式变了。当你的数据是几百万行、几十张关联表用户还要在报表上随意切片、钻取、交叉筛选时传统「一格一公式」的模式根本撑不住——你不可能为每一种筛选组合预先写好公式。DAX 的设计思路是把「当前筛选环境」作为计算的隐含输入。同一个[销售额]度量值放在「按年份」的图里算的是年度销售放在「按地区」的表里算的是地区销售公式一个字没改。这种「计算随上下文自动变化」的能力是 DAX 存在的根本理由也是它区别于普通公式语言的关键特征。2.3 函数库不是重点上下文才是初学者常有的错觉是DAX 难在函数多。其实书里第 2 章把常用函数按聚合、逻辑、信息、数学、文本、转换、日期时间、关系分门别类讲了一遍真正需要死记的并不多。难的是第 4 章和第 5 章讲的「计算上下文」——筛选上下文和行上下文以及CALCULATE触发的上下文转换。可以这样理解函数是词汇上下文是语法。词汇查手册就有语法错了句子就不通。很多人 DAX 写不对不是不知道SUMX怎么用而是没搞清「我现在处在哪种上下文里、这个上下文是怎么来的」。这本书把上下文单独拎出来讲了两大章正是因为它值得。提示如果你只记一件事就记「DAX 的计算结果 表达式 当前上下文」。表达式写在明处上下文藏在暗处出问题多半是暗处那半。3. 把 DAX 拆开看几个必须分清的核心概念3.1 计算列和度量值一个存下来一个算出来这是初学者第一个高频翻车点。计算列是在数据表里新增一列公式对每一行求值结果会真实存进模型、占用内存度量值不存结果只存公式在你把它拖进视觉对象时才按当前筛选实时计算。书里第 2 章用「计算列 vs 度量值」做了明确区分。判断标准其实很朴素如果你要的是「每一行自己的属性」比如给每笔订单标出「单价 × 数量」的金额用计算列如果你要的是「当前筛选下的汇总」比如「所选地区的总销售额」用度量值。把汇总逻辑写进计算列是新手最常见的错误之一结果往往是数字对不上还找不到原因。3.2 行上下文和筛选上下文两种「当前范围」行上下文row context出现在计算列和迭代函数里意思是「我正在逐行处理当前这一行是谁」。筛选上下文filter context出现在报表的筛选器、切片器、视觉对象的行列上意思是「当前这次计算哪些数据被选中了」。两者的关系是 DAX 最烧脑的部分。行上下文不会自动变成筛选上下文除非你用了CALCULATE——这就是「上下文转换」。书里第 5 章用大量篇幅讲这个机制因为它是理解CALCULATE行为的钥匙。通俗地说行上下文是「我在看这一行」筛选上下文是「整个模型现在只剩这些行」CALCULATE的作用就是把前者翻译成后者。3.3 CALCULATEDAX 里最值得单独学的一个函数如果 DAX 只能学一个函数那一定是CALCULATE。它的作用是「在修改后的筛选上下文里计算一个表达式」。所有「占比」「同比」「占整体比例」「忽略某个筛选」的需求几乎都要经过它。-- 计算所选产品占全部产品销售额的比例 Sales Pct of All DIVIDE ( [Sales Amount], -- 当前筛选上下文下的销售额 CALCULATE ( [Sales Amount], -- 同一个度量值 ALL ( Product ) -- 但先移除 Product 表上的所有筛选 ) )这段代码里分子跟着报表筛选走分母用ALL(Product)清掉了产品维度的筛选于是得到「当前产品 / 全部产品」的比例。DIVIDE相比直接用/的好处是能处理除零返回空白而不是报错。参数上CALCULATE第一个参数是要计算的表达式后面可以跟任意多个筛选修饰符ALL、KEEPFILTERS、USERELATIONSHIP、CROSSFILTER都属于这一类。书里第 5 章把这些修饰符逐个拆开讲还专门讨论了CALCULATE内部的求值顺序——这个顺序搞不清嵌套CALCULATE就会写出「玄学」结果。3.4 变量 VAR让长公式能读、能调、不重复算DAX 公式一长就容易变成「括号地狱」。VAR语法允许你把中间结果命名后面直接引用。书里第 6 章强调了两点变量是常量一旦赋值不会随上下文再变变量有作用域只在定义它的表达式内可见。-- 用变量拆解「高价值客户销售额」 High Value Sales VAR CustomerSales [Sales Amount] -- 先算出当前上下文销售额 VAR Threshold 10000 -- 设定阈值 RETURN CALCULATE ( [Sales Amount], FILTER ( VALUES ( Customer[Name] ), [Sales Amount] Threshold ) )变量的价值不只是好看它还能避免同一段逻辑被重复计算对性能有实际影响。书里还提到「惰性求值」变量不是定义时就执行而是在真正被引用时才计算这一点在写复杂度量值时会影响你对执行顺序的判断。3.5 迭代函数SUMX 和 SUM 差在哪SUM是对一列直接求和SUMX是先逐行算一个表达式、再把结果加起来。差别在于SUMX带有行上下文可以在里面引用多列、调用其他函数。书里第 7 章讲迭代器时特别提醒「基数」问题迭代表越大逐行计算的成本越高能不用迭代就不用非用不可时要留意性能。一个典型例子是「销售额 单价 × 数量」的汇总。如果表里没有现成的金额列就得用SUMX(Sales, Sales[Price] * Sales[Quantity])。这里的乘法发生在每一行的行上下文里SUMX负责把每行结果累加。理解了这个模式后面遇到AVERAGEX、MAXX、CONCATENATEX都是同一套逻辑。4. 容易混淆的几个概念别在这些地方栽跟头4.1 易混点一CALCULATE 和 FILTER 都能「筛选」但不是一回事很多人以为CALCULATE里套FILTER和直接写筛选条件等价。实际上CALCULATE的筛选参数如果是布尔表达式会走简化的单列筛选而FILTER返回的是一张表作为筛选参数时会替换掉对应表上的原有筛选行为更重、更容易影响性能。区分方法条件只涉及单列且是简单比较优先用CALCULATE直接写条件需要跨列、需要引用度量值做行级判断时才用FILTER。4.2 易混点二ALL 和 ALLSELECTED 看着像语义差很远ALL是「移除所有筛选」ALLSELECTED是「移除当前视觉对象内部的筛选但保留外部切片器的选择」。做「占所选范围的比例」时用ALLSELECTED做「占全表比例」时用ALL。混用会导致分母范围不对报表数字看着合理、实际全错。书里第 3 章和第 5 章都反复提到这一对值得单独记一笔。4.3 易混点三关系方向决定筛选能不能「传过去」数据模型里的关系有方向。一对多关系中筛选通常从「一」端流向「多」端。如果你在「多」端放筛选器却期望它影响「一」端的计算默认是传不过去的需要CROSSFILTER调整。初学者常把「表连上了」等同于「筛选互通」这是两件事。书里第 15 章专门讲高级关系包括多对多和双向筛选的代价。4.4 易混点四计算列里的 SUM 和度量值里的 SUM 结果可能不同在计算列里写SUM(Sales[Amount])因为没有筛选上下文往往算的是整表合计然后每一行都得到同一个数——这通常不是你想要的结果。度量值里的SUM才会跟随报表筛选变化。区分方法问自己「这个结果应该随切片器变吗」答案是「应该」就放度量值。4.5 易混点五时间智能函数不是万能钥匙TOTALYTD、SAMEPERIODLASTYEAR这类函数依赖一张标记为日期表的连续日期表。没有正确标记日期表函数会报错或给出莫名其妙的结果。这不是函数本身的问题是模型准备没做到位。书里第 8 章讲时间智能时前置条件讲得比函数用法还细原因就在这里。5. 什么时候该翻这本书什么时候先放一放先说该用的时候。如果你已经在 Power BI 或 Excel Power Pivot 里写过一些度量值能跑通简单汇总但一遇到「占比不对」「同比算出来是空白」「CALCULATE 嵌套后结果玄学」就卡住那这本书正好补上你缺的那层理论。它把上下文、上下文转换、CALCULATE求值顺序这些「黑匣子」拆开给你看看完再回头调公式很多血泪经验就不用自己踩一遍。书的后半部分第 17 到 20 章讲 DAX 引擎、VertiPaq 优化和查询计划分析适合已经能写对公式、开始关心「为什么慢」的人。再说先放一放的时候。如果你连 Power BI 的基本操作都没摸过表关系怎么建、视觉对象怎么放还不熟直接啃这本 700 多页的英文原版会非常吃力——它假设你已经知道什么是数据模型、什么是度量值。另外如果你只是偶尔做一张简单报表SUM加几个切片器就够用那暂时不需要系统学 DAX遇到具体问题查函数文档效率更高。下面这张表可以帮你快速判断自己处在哪个阶段你的状态建议没建过数据模型没写过度量值先补 Power BI 基础操作暂缓能写简单度量值但占比/同比总算错重点读第 4、5、8 章公式能写对但报表刷新慢重点读第 17 到 20 章要处理多对多、双向筛选等复杂关系重点读第 15 章想系统建立 DAX 知识体系按章节顺序通读我自己的习惯是每次写CALCULATE之前先在心里默念一遍「当前筛选上下文是什么、我要改哪部分、改完影响谁」三步走完再动手。这个习惯帮我省掉了大量「数字看着对、其实全错」的返工。希望帮到你。本文还有配套的精品资源点击获取