新書推薦:
《
世界航空地理(世界国别与区域地理研究丛书)
》
售價:HK$
244.2
《
学术的中心:英法德美
》
售價:HK$
87.4
《
为什么要读人类学
》
售價:HK$
77.3
《
井邑无衣冠 : 地方视野下的唐代精英与社会
》
售價:HK$
95.2
《
星地融合移动通信系统与关键技术从5G NTN到6G的卫星互联网发展
》
售價:HK$
212.6
《
妈妈,你好吗?(一封写给妈妈的“控诉”信,日本绘本奖作品)
》
售價:HK$
42.6
《
保守主义:为传统而战
》
售價:HK$
154.6
《
不同境遇的36岁:无尽与有限+人生半熟
》
售價:HK$
112.0
編輯推薦:
DAX里程碑式经典教材,亚马逊4.8分(总分5分)
本书的目的,让你真正掌握DAX!!
微软MVP,PowerBI可视化大赛评委翻译
原书作者、DAX之父、ExcelHome创始人、PowerBIMVP力荐
內容簡介:
本书是微软DAX语言在商业智能分析、数据建模和数据分析方面的指南。
通过对本书的学习,你将了解如何使用DAX语言进行商业智能分析、数据建模和数据分析;你将掌握从基础表函数到高级代码,以及模型优化的所有内容;你将确切了解在运行DAX表达式时,引擎内部所执行的操作,并利用这些知识编写可以高速运行且健壮的代码。
本书第2版的重点内容包括基于免费的Power BI Desktop来构建和运行示例,帮助你在Power Bl、SQL Server Analysis Services或Excel中充分利用强大的变量(VAR)语法。你想要使用DAX所有的强大功能吗?那么这本未进行任何删减、深入浅出的著作正是你所需要的。
本书适合Excel高级用户、商业智能分析人员、使用DAX和微软分析工具的专业人士。
關於作者:
Marco Russo&Alberto Ferrari
SQLBI.COM的创始人。其定期发布关于微软Power BI、PowerPivot、DAX和SQL Server的文章。自2009年测试版的Power Pivot发布以来,SQLBI.COM成了DAX相关文章和教程的主要来源之一。他为商业智能(Business Intelligence,BI)解决方案提供咨询和指导,并精通与BI相关的微软技术。
高飞
数据分析师,BI总监2015年接触Power Pivot,被DAX语言的强大和灵活所吸引。
2016年3月创建了面向Power BI用户的微信公众号Power BI极客,并更新至今。
2019年上线同名网站PowerBIGeek.com,致力于打造一个综合性的Power BI中文学习网站。现从事技术分享,企业BI项目实施和培训工作。微软Power BI最有价值专家(MVP),Power BI可视化大赛评委,ExcelHome论坛版主。
目錄 :
目 录
第1章 DAX是什么 1
理解数据模型 1
理解关系的方向 3
给Excel用户的DAX学习建议 5
单元格和智能表格 5
Excel函数和DAX:两种函数式语言 7
使用迭代器 7
DAX相关理论 8
给SQL开发人员的DAX学习建议 8
处理关系 9
DAX是函数式语言 9
DAX是一种编程语言和查询语言 10
DAX和SQL中的子查询与条件语句 10
给MDX开发者的DAX学习建议 11
多维模型和表格模型 12
DAX是一种编程语言和查询语言 12
层级结构 12
叶级计算 14
给Power BI用户的DAX学习建议 14
第2章 DAX介绍 15
理解DAX计算 15
DAX的数据类型 17
DAX运算符 20
表构造器 22
条件语句 22
理解计算列和度量值 23
计算列 23
度量值 24
正确选择计算列和度量值 27
变量 28
处理DAX表达式中的错误 29
转换错误 29
算术运算错误 30
空值或缺失值 30
截获错误 32
生成错误 35
规范化DAX代码 36
聚合函数和迭代函数介绍 39
认识常用的DAX函数 42
聚合函数 42
逻辑函数 43
信息函数 45
数学函数 45
三角函数 46
文本函数 46
转换函数 48
日期和时间函数 48
关系函数 49
结论 51
第3章 使用基础表函数 52
表函数介绍 52
EVALUATE函数语法介绍 54
理解FILTER函数 56
ALL和ALLEXCEPT函数介绍 58
理解VALUES、DISTINCT函数和空行 63
将表用作作为标量值 68
ALLSELECTED函数介绍 70
结论 72
第4章 理解计值上下文 73
计值上下文介绍 74
理解筛选上下文 74
理解行上下文 79
测试你对计值上下文的理解 81
在计算列中使用SUM函数 81
在度量值中使用列 83
使用迭代函数创建行上下文 83
嵌套多个表的行上下文 84
同一个表上的多层嵌套行上下文 85
使用EARLIER函数 90
理解FILTER、ALL函数和上下文交互 91
使用多个表 94
行上下文和关系 95
筛选上下文和关系 98
在筛选上下文中使用DISTINCT和SUMMARIZE函数 102
结论 105
第5章 理解CALCULATE和CALCULATETABLE函数 107
CALCULATE和CALCULATETABLE函数介绍 107
创建筛选上下文 108
CALCULATE函数介绍 111
使用CALCULATE函数计算百分比 116
KEEPFILTERS函数介绍 126
筛选单列 130
筛选复杂条件 131
CALCULATE计值顺序 135
理解上下文转换 139
行上下文和筛选上下文回顾 139
上下文转换介绍 142
计算列中的上下文转换 145
度量值中的上下文转换 148
理解循环依赖 151
CALCULATE函数调节器 155
理解USERELATIONSHIP函数 155
理解CROSSFILTER函数 158
理解KEEPFILTERS函数 159
理解CALCULATE函数中的ALL函数 160
无参数的ALL和ALLSELECTED函数介绍 162
CALCULATE规则总结 163
第6章 变量 165
VAR语法介绍 165
变量是常数 167
理解变量的范围 168
使用表作为变量 171
理解惰性计算 173
使用变量的常见模式 174
结论 176
第7章 迭代函数和CALCULATE函数的使用 177
迭代函数的使用 177
理解迭代的基数 178
在迭代函数中使用上下文转换 180
CONCATENATEX函数的使用 184
返回表的迭代函数 186
使用迭代函数解决常见问题 189
计算平均和移动平均 189
RANKX函数的使用 192
改变计算的颗粒度 200
结论 204
第8章 时间智能计算 205
时间智能介绍 205
Power BI中的自动日期时间 206
Excel Power Pivot中的自动日期列 207
Excel Power Pivot中的日期表模板 208
创建日期表 208
CALENDAR和CALENDARAUTO函数的使用 209
多个日期表的使用 212
处理连接到与日期表的多个关系 212
处理多个日期表 214
理解基础时间智能计算 215
标记为日期表 219
基础时间智能函数介绍 221
计算年初至今、季度初至今和月初至今 222
计算平移后的周期平移 224
嵌套混合使用时间智能函数 227
计算周期之间的差异 229
计算移动年度总计 231
为嵌套的时间智能函数选择正确的调用顺序 232
理解半累加计算 234
使用LASTDATE和LASTNONBLANK函数 236
使用期初和期末余额 241
理解高级时间智能计算 245
理解累计至今区间 246
理解DATEADD函数 249
理解FIRSTDATE、LASTDATE、FIRSTNONBLANK和
LASTNONBLANK函数 255
利用时间智能函数进行钻取 258
使用自定义日期表 258
基于周的时间智能 259
自定义YTD、QTD和MTD 262
结论 264
第9章 计算组 265
计算组介绍 265
创建计算组 268
理解计算组 274
理解计算项的应用 277
理解计算组优先级 285
在计算项中包含或排除度量值 289
理解横向递归 292
使用最佳实践 296
结论 296
第10章 使用筛选上下文 298
使用HASONEVALUE和SELECTEDVALUE函数 299
ISFILTERED和ISCROSSFILTERED函数介绍 303
理解VALUES和FILTERS函数的区别 306
理解ALLEXCEPT和ALLVALUES函数的区别 308
使用ALL函数避免上下文转换 312
使用ISEMPTY函数 314
数据沿袭和TREATAS函数介绍 316
使用固化筛选器 320
结论 326
第11章 处理层级结构 328
计算层级占比 328
处理父子层级结构 333
结论 344
第12章 使用表函数 345
使用CALCULATETABLE函数 345
操作表的函数 347
使用ADDCOLUMNS函数 348
使用SUMMARIZE函数 351
使用CROSSJOIN函数 354
使用UNION函数 356
使用INTERSECT函数 360
使用EXCEPT函数 361
使用表作为筛选器 363
实现或(OR)条件 364
将销售额的计算范围缩小至首年客户 367
计算新客户 368
使用DETAILROWS函数复用表表达式 370
创建计算表 372
使用SELECTCOLUMNS函数 372
使用ROW函数创建静态表 373
使用DATATABLE函数创建静态表 374
使用GENERATESERIES函数 375
结论 376
第13章 编写查询 377
DAX Studio介绍 377
理解EVALUATE函数 378
EVALUATE函数语法介绍 378
在DEFINE函数中使用VAR 379
在DEFINE函数中使用度量值 381
实现DAX查询的常用模式 382
使用ROW函数测试度量值 382
使用SUMMARIZE函数 383
使用SUMMARIZECOLUMNS函数 385
使用TOPN函数 391
使用GENERATE和GENERATEALL函数 396
使用ISONORAFTER函数 399
使用ADDMISSINGITEMS函数 401
使用TOPNSKIP函数 402
使用GROUPBY函数 402
使用NATURALINNERJOIN和NATURALLEFTOUTERJOIN函数 405
使用SUBSTITUTEWITHINDEX函数 407
使用SAMPLE函数 409
理解DAX查询中的自动匹配(Auto-Exists)行为 410
结论 416
第14章 高级DAX原理 418
扩展表介绍 418
理解RELATED函数 422
在计算列中使用RELATED函数 424
理解表筛选器和列筛选器的区别 425
在度量值中使用表筛选器 428
理解活动关系 431
表的扩展行为和筛选行为的区别 433
扩展表中的上下文转换 435
理解ALLSELECTED函数和影子筛选上下文 436
影子筛选上下文介绍 437
ALLSELECTED函数返回迭代的行 441
无参数的ALLSELECTED函数 443
ALL系列函数 443
ALL函数 445
ALLEXCEPT函数 446
ALLNOBLANKROW函数 446
ALLSELECTED函数 446
ALLCROSSFILTERED函数 446
理解数据沿袭 446
结论 449
第15章 高级关系 451
使用计算列创建物理关系 451
创建基于多列的关系 451
创建基于范围的关系 453
使用计算列创建关系中的循环依赖问题 456
使用虚拟关系 459
在DAX中转移筛选器 460
使用TREATAS函数转移筛选器 462
使用INTERSECT函数转移筛选器 463
使用FILTER函数转移筛选器 464
使用虚拟关系实现动态分组 465
理解DAX中的物理关系 468
使用双向交叉筛选器 470
理解一对多关系 472
理解一对一关系 473
理解多对多关系 473
通过桥接表实现多对多关系 473
通过公共维度表实现多对多关系 479
使用MMR弱关系实现多对多关系 483
选择正确的关系类型 485
管理数据颗粒度 486
管理关系中的歧义 490
理解活动关系中的歧义 492
解决非活动关系中的歧义 494
结论 496
第16章 DAX中的高级计算 497
计算两个日期之间的工作日数量 497
同时展示预算数据和销售数据 505
计算同店销售额 508
对事件进行排序 514
根据最新销售日期计算上一年的销售额 517
结论 522
第17章 DAX引擎 523
了解DAX引擎的架构 523
公式引擎介绍 524
存储引擎介绍 525
VertiPaq(in-memory)存储引擎介绍 526
DirectQuery存储引擎介绍 527
理解数据刷新 527
理解VertiPaq存储引擎 528
列式数据库介绍 528
理解VertiPaq压缩 531
理解值编码 531
理解哈希编码 532
理解行程长度编码(RLE) 533
理解再编码 536
确定最佳排序顺序 536
理解层级和关系 538
理解分段和分区 539
使用动态管理视图 540
理解关系在VertiPaq中的运用 542
物化介绍 545
聚合表介绍 547
为VertiPaq配置合适的硬件 549
是否可以自主选择硬件 550
设置硬件优先级 550
CPU型号 550
内存速度 552
内核数量 552
内存大小 552
硬盘IO和分页 553
硬件选择的最佳实践 553
结论 553
第18章 优化VertiPaq引擎 555
收集有关数据
內容試閱 :
译者序
欢迎来到DAX的世界
你好!我是本书的译者,高飞。
很高兴你打开了这本书,很荣幸由我来为你转述关于DAX语言的所有秘密。
我猜你已经用过Excel Power Pivot、Power BI或者SQL Server Analysis Services,并且惊叹于它强大的数据存储和运算能力。没错,在这些工具中,你都可以使用DAX对数百万、上千万行甚至更多的数据展开灵活的分析,这是一门跨Excel、商业智能和企业级工具的分析语言。
DAX就像它的全称Data Analysis eXpression所描述的那样,是一门用于数据分析的函数式语言。是的,DAX和我们所熟悉的Excel公式都是基于函数的表达式,为了便于用户快速上手,DAX中的很多函数都直接照搬自Excel。所以,只要你熟悉Excel,DAX便会让你产生一种亲切感,甚至可以快速实现一些常见的计算。
但是这种便利性仅限于起步阶段。DAX与大多数编程语言不同,它有很多独特且重要的理论,比如计值上下文、迭代和上下文转换等,理解这些概念是决定你能否掌握DAX的关键。相信这也正是你打开本书的原因。The Definitive Guide to DAX: Business intelligence with Microsoft Power BI, SQL Server Analysis Services, and Excel在全球被奉为学习DAX的经典书目,其权威程度超过微软官方文档。它的知识框架足够系统和全面,在广度和深度这两个层面,都是当之无愧的NO.1。可以说,读懂了这本书,你就解锁了DAX的所有秘密。
DAX由微软的SQL Server Analysis Services团队开发,作为代号Gemini项目的一部分,在2009年与PowerPivot for Excel 2010插件一起发布。当时的微软敏锐地觉察到了自助分析的浪潮即将到来,基于自身在数据库领域的深厚积累,推出了更适合自助分析的表格模型解决方案,并在MDX、SQL和Excel公式的基础上开发出了全新的DAX语言。随着大数据时代的到来和商业智能产品的流行,这项投入被证明是极富远见的。在本书中,我荣幸地邀请到了目前担任微软首席工程经理,同时也是开发DAX编程语言和查询处理器的主导人物Jeffrey Wang为本书作序。
在翻译本书的过程中,我多次与两位作者Marco Russo和Alberto Ferrari通过邮件往来,询问技术细节和甄别勘误,两位作者的热情和耐心给我留下了深刻的印象。在他们的帮助下,本书中文版本修订了原著中的多处错误,相信在全球范围内,本书中文版很可能是目前质量最好的一个版本。
在此,我要感谢电子工业出版社的编辑王静老师的信任和支持。很多读者可能不知道,本书的翻译工作始于2017年夏天,我利用业余时间,花了一年多完成了本书第1版的翻译。巧合的是,此时本书第2版也传来了即将发布的消息,我们经过短暂的商议决定放弃已经翻译好的第1版,继续翻译第2版,于是,又是一年多的时间,这一轮横跨4年,两个版本的漫长翻译工作才终于落下帷幕。
坦白地讲,翻译工作本身是枯燥的,尤其是面对这么一本大部头的技术型著作,唯一能让我坚持下去的动力就是它给读者们带来的价值。所以,虽然道阻且长,我却始终不敢掉以轻心。为了保证所有章节在行文和逻辑方面的一致性和准确性,全书由我一人翻译完成,这样可以最大程度地保证翻译质量,但是这也意味着要付出更多的时间。感谢各位读者的理解和等待。在此,也要感谢所有参与校对工作的编辑们,你们的付出进一步提高了本书的质量。
Power BI和DAX的流行离不开用户的无私分享和社区的壮大,在国内,很多微软热心人士、企业和Power BI爱好者都为此贡献了自己的力量,在我的心目中有一个长长的感谢名单,因篇幅所限,无法在此一一列举,谨邀请其中两位微软MVP:敏捷艾科创始人,Power BI中国区可视化比赛的推动者赵文超和ExcelHome创始人周庆麟老师为本书作序,以表感谢。
最后,我必须要郑重感谢的一个人是我的老婆,正是你的支持和鼓励,允许我占用属于周末和节假日的二人时间,我才得以完成这项浩大的工程。
由于水平所限,书中难免会有不合理甚至错误之处,欢迎读者朋友批评与指正。如果你对这本书有任何疑问,可以访问Power BI极客(powerbigeek)网站的DAX圣经专区留下你的宝贵意见。
现在,DAX的旅程即将开始,你准备好了吗?
高飞
2021年1月于 上海
前 言
我们已经创作了大量关于DAX的内容,比如那些关于Power Pivot和SSAS表格模型的书、博客、文章、白皮书,以及一本关于DAX Patterns的著作。还有必要再为DAX另外写一本书吗?这门语言值得花这么多精力吗?当然,我们认为答案是肯定的。
当一本书诞生时,编辑首先关心的是它的页数。这一点之所以重要,是因为页数涉及定价、管理和资源的分配等。这多少让作者有一点沮丧。事实上,每次写书时,我们都需要谨慎分配关于产品(无论是Excel Power Pivot还是SSAS表格模型)和DAX语言描述所占的资源。没有足够的篇幅让我们对DAX畅所欲言的感觉是痛苦的。毕竟,你不可能写1000页关于Power Pivot的内容,这种体量的书对任何人来说都是一场噩梦。
因此,这些年来,我们在撰写关于Power Pivot和SSAS表格模型的书的同时,也编写了一本系统阐述DAX的书,只不过它暂时被封存。现在,我们决定打开封印,不再纠结摘录哪一部分内容我们将介绍关于DAX的所有细节,不做任何删减,这就是本书的由来。
本书不介绍如何创建计算列,不告诉你在哪个对话框中可以设置哪些属性。因为这不是一本手把手教你使用Visual Studio、Power BI和Power Pivot的书。相反,它将深入介绍DAX语言,从入门开始一直到非常技术化的细节,来指导你如何优化自己的代码和模型。
在创作过程中,我们对它的每一页都爱不释手,无数次回顾这些内容,以至于可以倒背如流。每当我们认为有重要的内容要补充时,就会继续添加内容。这让本书的页数只增不减,因为每一页都是有价值的。在此期间,我们加深了对DAX的理解并且享受整个创作过程。
但还有一件事情需要说明,为什么你需要这样一本关于DAX的书?
在你第一次使用Power Pivot或Power BI之后可能就有了这种想法。拜托,你不是一个人,我们第一次使用之后也产生了这个困惑。DAX看起来太简单了!它和Excel函数是如此相似!而且,如果你学习过其他编程语言或查询语言,那么你可能已经习惯参照语法实例、套用已经掌握的思维模式来学习一门新的语言。这些都是我们在学习DAX过程中犯过的错误,希望你不要重蹈覆辙。
DAX是一门强大的语言,支持这门语言的分析工具正在不断增加。但在强大的背后,它的一些原理很难通过归纳法(从具体实例推导出普遍规律的一种方法)来理解。例如,对计值上下文(Evaluation Context)的理解需要用到演绎推理:先接触理论本身,再通过案例加深对理论的理解。我们知道很多人都不习惯这种学习方式,他们更喜欢在实践中学习,即先研究如何解决具体问题,再通过不断的练习和积累,归纳出公式背后的原理。如果你也希望使用这种方式学习,那么本书可能不适合你。我们另有一本书:DAX Patterns,它是一本面向实战的案例集,不包含公式原理的解释,也不会告诉你为什么公式写成这样效率更高,它适合让你以直接套用的方式解决实际问题。但本书的目的是让你真正掌握DAX。基于此,本书中所有的案例都是为了解释DAX语言的行为,而非解决特定问题。如果你发现书中的某些公式恰好可以应用到你的模型里,那么恭喜你。但请记住,这只是意外之喜,并非案例的本意。最后,请务必留意书中的注解,以确保理解案例中的代码所包含的陷阱。出于讲解的目的,书中使用的公式源码通常并非最佳实践。
希望你能和我们一起享受这段学习DAX的美妙旅程,就像当初我们写这本书时那样。
本书受众
如果你只是偶尔会使用DAX,那么本书或许不是最佳选择。市面上已经有很多书提供了DAX相关工具和语言本身的简明介绍,它们可以帮助你从零开始达到基础级别的DAX编程水平。我们对此非常了解,因为我们也写过类似的书。
而如果你是抱着认真的态度学习DAX,想要了解这门优美语言的所有细节,那么本书就是为你准备的。如果这是你学习DAX的第一本书,那么请不要期望太早领悟那些高级概念。建议你首先通读全书,等到积累一些经验后再重读那些最复杂的章节,那时你会对它们有更清晰的了解。
不同职位、不同目的的人都可以从DAX中获益,Excel用户可以利用DAX操控Power Pivot数据模型,商业智能(BI)专家需要在不同规模的BI解决方案中编写DAX代码,非专业Power BI使用者需要在自助BI模型中编写DAX公式。不同的人群在本书中都能找到适合自己的内容。某些内容(特别是性能优化部分)更适合BI专家,因为用于优化DAX度量值的知识具备比较高的技术性;但我们认为Excel用户同样需要了解DAX表达式之间的性能差异,以便获得最佳的模型运行效果。
最后,你需要不断从本书中学习,而不能仅仅停留在阅读阶段。我们保持入门部分的内容的通俗易懂,并遵循从零开始学DAX的逻辑路径。然而,当其中涉及的概念开始变得复杂时,我们将不再试图简化它,而是回归真实。DAX不是一门简单的语言,掌握它和理解引擎的每处细节花费了我们多年的时间,不要奢望随手翻翻本书就能明白全部内容。你在阅读本书时要高度集中注意力。作为回报,我们提供了关于DAX各个方面的内容,且这些内容是前所未有的,以助你成为一名真正的DAX专家。
准备知识
我们希望本书读者在Power BI和数据分析方面具备一定的基础知识,如果你对DAX有过一些接触,这对你有好处,它能帮助你更快地阅读本书第一部分内容。当然,了解DAX不是必需的。
本书部分内容引用了MDX和SQL代码,但你不必预先了解这些语言,因为它们只是反映不同表达式之间的区别,即使你不了解这些代码也没有关系。这意味着那些特定主题不是为你准备的。
在本书最复杂的高级内容部分,我们介绍了并行计算、内存访问、CPU使用,以及其他过于高深、让大部分读者可能感到陌生的知识。开发人员熟悉这些内容,而Excel高级用户可能有点畏惧。不过,当涉及优化内容时,这些信息是必需的。因此,本书最复杂的部分面向BI开发人员而不是Power BI和Excel用户。然而,我们相信每个阅读过它的人都会从中受益。
本书编排
本书在内容设计上遵循合理的逻辑顺序,从入门内容逐步深入到复杂内容。每章的内容在撰写时都基于之前内容被完全理解的基础之上;几乎不会重复前面介绍过的概念。正因如此,我们强烈建议读者在首次阅读本书时采用从头至尾的方式系统学习,不要提前跳到复杂章节。
读过一次之后,它就可以成为你学习DAX的参考书。例如,如果你对ALLSELECTED函数的原理不是很明白,则可以直接翻到讲解这个函数的那章打消疑问。不过,在缺少对之前内容理解的情况下,阅读该部分可能无法达到预期效果,甚至会遇到更糟糕的情况:产生片面或错误的理解。
以下是各章节内容概览。
第1章是对DAX的简要介绍,其中有些内容是专门针对已经有其他编程语言基础的用户,比如SQL、Excel或MDX。本章没有引入任何新概念,只给出你可能已经知道的,一些关于DAX和其他语言差异的提示。 第2章介绍DAX语言的概况,涵盖计算列、度量值、错误处理函数等基本概念,并列出DAX的大部分基础函数。 第3章专门介绍基础表函数。DAX的许多函数都使用表作为参数或返回表作为结果。本章内容涵盖最基本的表函数。高级表函数将在第12章和第13章中介绍。 第4章专门介绍计值上下文。计值上下文是整个DAX语言的基石,本章连同第5章,是整本书最重要的内容。 第5章只介绍两个函数:CALCULATE和CALCULATETABLE。它们是DAX中最重要的函数,是否理解计值上下文将直接决定你能否用好这两个函数。 第6章介绍变量。在本书的案例中使用了大量的变量,本章专门介绍它们的语法并解释如何使用变量。当你在接下来的章节中看到大量使用变量的例子时,本章内容将是非常有参考性的。 第7章介绍迭代器和CALCULATE函数:二者是天作之合。学习如何使用迭代器,以及上下文转换,可以充分发挥DAX的强大功能。本章中会介绍几个有助于理解如何利用这些工具的例子。 第8章深入阐述时间智能计算,包括年初至今、月初至今、去年同期、基于周的时间段和自定义日期表等常用计算。 第9章专门介绍DAX中引入的最新特性:计算组(Calculation Groups)。计算组是非常强大的建模工具。本章介绍如何创建和使用计算组,以及计算组的基本概念,并展示了一些示例。 第10章介绍筛选上下文的更高级用法,比如数据沿袭、对筛选上下文的检查及编写高级公式的有用工具。 第11章介绍如何对层级结构执行计算,以及如何使用DAX处理父子结构。 第12章和第13章介绍对编写查询和或执行高级计算都很有用的高级表函数。 第14章进一步介绍计值上下文的知识,并在扩展表理论的帮助下介绍诸如ALLSELECTED和KEEPFILTERS之类的复杂函数。本章内容属于高级内容,揭示了复杂DAX表达式的大部分秘密。 第15章介绍如何管理DAX中的关系。实际上,借助DAX,任何类型的关系都可以在数据模型中被设置。本章介绍分析型数据模型中常见的多种类型的关系。 第16章介绍几个用DAX解决的复杂计算案例。这是关于DAX语言的最后一章,本章有助于读者发现解决方案和产生新的想法。 第17章详细描述VertiPaq引擎,它是运行DAX模型时最常用的存储引擎。了解这一点,对于学习如何在DAX公式中获得最佳性能至关重要。 第18章基于第17章的内容,介绍数据模型级别可用的优化手段。读者会在本章学到何时规范化模型,如何减少列基数,如何设置关系和使用最少的内存以在DAX中获得最佳性能。 第19章介绍如何读懂查询计划,以及如何借助DAX Studio和SQL Server Profiler等工具来评估DAX查询的性能。 第20章基于之前章节介绍的优化知识,介绍一些技术解决方案,本章首先展示示例公式,然后评估它们的性能,最后解释并给出优化后的公式。