为了确保中文版及其配套内容的持续准确性,本页用于发布指南中已知的勘误,以下是经译者审核并确认的错误,分为翻译错误和因软件功能更新产生的过时描述,如果您发现了以下两个部分都没有包含的新问题,请留言告知,谢谢。
- 了解中文版详情,请访问DAX 权威指南中文版专区页面
- 查看英文原版勘误,请访问此页面
注:数字尾标代表此错误出现在第几次印刷中(无尾标代表首次印刷的版本),低印次中的错误将在下次印刷时修正。即如果一条勘误的尾标为 2,那么它会出现在第 1 和第 2 次印刷的版本中,但会在第 3 次印刷时被修正。
中文版勘误
-
- 第 4 页 倒数第四段「Product 表与 Sales 表的关系是单向的」表述有误
应为:「Product 表位于 Sales 表的一端」 - 第 20 页 文本类型第一行「DAX 中的每个字符串都被存储为 16 位 Unicode 字符串」表述有误
应为:「DAX 中的每个字符串都被存储为 Unicode 字符串,其中每个字符以 16 位存储」 - 第 43 页 部分用于计数的函数介绍有误:
COUNT 可以对除布尔值外的任何数据类型进行计数;
COUNTBLANK 返回列中空单元格(包含空值或空字符串)的数量
DISTINCTCOUNT 返回列中非重复值的个数,包含空值 - 第 43 页 中间段落关于 Excel 的表述缺少一个介词:其中
应为:「它们继承自 Excel,其中COUNTA 接受包括字符串在内的任何数据类型,而 COUNT 只接受数值列」 - 第 44,45 页 代码块在引用计算列时未加表名,有一处漏掉了「Extra Large」
---- 逻辑函数 ---- Sales[Amount] = IFERROR( Sales[Quantity] * Sales[Price], BLANK( ) ) 'Product'[SizeDesc] = IF( 'Product'[Size] = "S", "Small", IF( 'Product'[Size] = "M", "Medium", IF( 'Product'[Size] = "L", "Large", IF( 'Product'[Size] = "XL", "Extra Large", "Other" ) ) ) ) 'Product'[SizeDesc] = SWITCH( 'Product'[Size], "S", "Small", "M", "Medium", "L", "Large", "XL", "Extra Large", "Other" ) ---- 信息函数 ---- Sales[IsPriceCorrect] = NOT ISERROR( VALUE( Sales[Price] ) ) Sales[IsPriceCorrect] = ISNUMBER( Sales[Price] )
- 第 47 页 中间代码块中的前两行的 PeopleComma1 和 PeopleComma2 缺少中括号
应为:People[Comma1]和 People[Comma2] - 第 68 页 Brand Name 度量值引用的 Brand 列漏掉了表名的单引号
应为: ‘Product'[Brand] - 第 72 页 最后一段第一行「因为它会让帮助你实现 …」中的让字多余,需要去掉7,
- 第 72 页 最后一段的倒数第三行,「在第 4 章中」应为「在第 4 章和第 5 章中」2
- 第 104 页 中间段落「我们需要的是 Sales[CustomerKey]颗粒度的行上下文,… 在第3章中介绍的 SUMMARIZE … 」中的第 3 章应为「第13章」8
- 第 109 页 最后一段的结尾,「毛利」应为「毛利率」
应为:「你可以通过迭代 ContosoSales 变量两次来计算 Contoso 产品的毛利率」,对应的度量值应为 Contoso GM% - 第 115 页 最后一个代码块中,CALCULATE 第一参数应为度量值形式
[Sales Amount Red Products] := CALCULATE ( [SalesAmount], FILTER ( ALL ( Product[Color] ), Product[Color] = "Red" ) )
- 第 133 页 最后一个代码块中,外层 CALCULATE 模拟的由切片器生成的筛选条件有误,应为2:
Sales Large Amount := CALCULATE ( CALCULATE ( [Sales Amount], FILTER ( ALL ( Sales[Quantity], Sales[Net Price] ), Sales[Quantity] * Sales[Net Price] >= 1000 ) ), 'Product'[Category] = "Audio", Sales[Net Price] >= 500 && Sales[Net Price] <= 3000 )
- 第 138 页,139 页 中的代码块少了一个 in,正确写法如下:
CALCULATE ( CALCULATE ( ..., Product[Color] IN { "Yellow", "Black" } ), Product[Color] IN { "Black", "Blue" } )
- 第 167 页 第一段 「例如,TotalCost 被使用在代码的两个不同部分」,中的 TotalCost 应为 SalesAmount。这里与原文不同,原因是 166 页 Margin%的代码有误,毛利率应为毛利与销售收入的比值,原文代码的分母误用为成本,中文版已修正4
- 第 174 页 Sales Large Customer 度量值的 WokingDaysIn2008 变量写法有误,不能计算出正确结果 2
Sales Large Customers := VAR LargeCustomers = FILTER ( Customer, [Sales Amount] > 10000 ) VAR WorkingDaysIn2008 = CALCULATETABLE ( SUMMARIZE ( 'Date', 'Date'[IsWorkingDay], 'Date'[Calendar Year] ), 'Date'[IsWorkingDay] = TRUE (), 'Date'[Calendar Year] = "CY 2008", ALL ( 'Date' ) ) RETURN CALCULATE ( [Sales Amount], LargeCustomers, KEEPFILTERS ( WorkingDaysIn2008 ) )
- 第 221 页 第二个代码块,第二行的 CALCULAT E 中间多了一个空格 2
应为:CALCULATE - 第 223 页 最后一个代码块,最后一行的’Date’Date]缺少一个左括号[ 2
应为: ‘Date'[Date] - 第 225 页 第一段,另一个有用的函数是…但是使用 PARALLEPERIOD 得到的是上一年…中的 PARALLEPERIOD 缺少一个L3
应为:PARALLELPERIOD - 第 230 页 图 8-18 的 YOY Sales 列和 YOY YTD Sales 列显示有误,根据上一页的描述,在 PY Sales 为空的行,YOY Sales 也应显示为空。请以案例文件中的效果为准4
- 第 231 页 第二个代码块,第一行的度量值名称多了中括号2
应为:MAT Sales := - 第 252 页 最后一行「2017年 6 月选择的 2 天…」中的 2017 应为 20078
- 第 241 页 第四段第一行的函数 STARTOFFMONTH 多了一个 F3
应为:STARTOFMONTH - 第 280 页 第一段第四行有两个 CALCULAT 少了字母 E
应为:CALCULATE - 第 285 页 结尾的代码块中 YTD 度量值引用的计算组名称有误,应为3
YTD := CALCULATE ( [Sales Amount], 'Time Intelligence'[Time calc] = "YTD" )
- 第 299 页 第二段「如图 10-1 所示…2017年 QTD 销售额为…」中的 2017 应为 2007;第三段「实际上,QTD Sales 在年份级别…上一年最后一个季度的值」中的上一年应为当年3
- 第 305 页 对 10-6 结果的分析中「Store 表没有被交叉筛选,因为对 Sales 表的筛选不会传递到Customer 表」中的 Customer 表应为 Store 表3
- 第 308 页 中间段落,「更好的做法是计算当前筛选下文中的行数…」中漏掉了一个上2
应为:更好的做法是计算当前筛选上下文中的行数 - 第 312 页 第二段第一行,「至此,我们可以 … 使用ALEXCEPT与使用 …」中的 ALEXCEPT 少了一个 L2
- 第 315 页 代码块第二行,Customer[CustomerKey]应为 Sales[CustomerKey],才能得出与图 10-17 相同的结果。虽然原始写法的逻辑也是正确的(以整个客户表为 Base),但结果与配图不符3
- 第 349 页 倒数第 7 行,「考虑计算占总销售额 15%的产品集合」表述不准确,应为 考虑按销售额从高到低计算占总销售额 15%的产品集合3
- 第 351 页 使用 SUMMARIZE 函数一节的第二段,「以计算不同颜色的 … 其中分别显示所有颜色的产品数量 …」中红色部分表述有误,应为 所有产品的颜色数量3
- 第 386 页 最后一段,「SUMMARIZECOLUMNS 还提供了使用 ROLLUPADDSUBTOTAL 和…」中第二个函数名称有误2
应为:「SUMMARIZECOLUMNS 还提供了使用ROLLUPADDISSUBTOTAL和 ROLLUPGROUP 计算小计的选项」 - 第 397 页 最后一个代码块中 ProductsSold 变量使用的 SUMMAR1IZE 中间多了一个 1,应去掉2
- 第 444 页 表 14-5 中 ALL 作为表函数的作用描述有误,应为:返回一列或多列的所有不重复值,或者表的所有值9
- 第 447 页和 448 页 两个页面的代码块中的 AddC2 变量所使用的新建列名称[C2]有误,应为 C2(去掉中括号)3
- 第 447 页 数据沿袭的基本规则最后一条,SELECTEDCOLUMNS 的拼写有误,应为 SELECTCOLUMNS5
- 第 508 页 第一段中「请注意,KEEPFILTERS 是必须的;否则…」表述有误2
应为:请注意,KEEPFILTERS 可以省略,因为 DateKey 列并非日期类型,即使被作为关系列,也无法覆盖来自外部的筛选上下文,可以正常和月份筛选器求交集。 - 第 520 页 第二段第三行,「此时 CALCULATE第二个参数强制要求日期必须…」中的第二个应为第三个3
- 第 527 页 第二段,「SQL 可以使用UPER和 LOWER 管理字符串变换」中的 UPER 应为 UPPER3
- 第 574 页 最后一段的中间部分「我们应该会产生这样的疑问:如果Amount列有 100 个唯一值 … … 此时,我们可以尝试只导入Amount列」中的 Amount 应为 Quantity7
应为:如果 Quantity 列有 100 个唯一值,Price 列有 10,000 个唯一值,那么 Amount 列中最多可能有 1,000,000 个唯一值。此时,我们可以尝试只导入 Quantity 和 Price 列 - 第 602 页 第一段,「VertiPaq 可以执行 xmlSQL 查询 … 而不是发送给函数引擎」中的函数引擎应为公式引擎8
- 第 670 页 标题行,「避免在表筛选器中使用 DISTINCTCOUNT 函数」应为「避免在表筛选器环境中使用 DISTINCTCOUNT 函数」8
- 第 4 页 倒数第四段「Product 表与 Sales 表的关系是单向的」表述有误
功能更新
2021 年 3 月开始,Power BI Desktop 支持CALCULATE 多筛选器参数的简化写法,所以第 131 页「筛选复杂条件」一节中使用的第一个公式写法有效:
Sales Large Amount := CALCULATE ( [Sales Amount], Sales[Quantity] * Sales[Net Price] >= 1000 //2021 年 3 月开始,Power BI Desktop 支持此语法 )
需要注意的是 Power Pivot 并不支持这种写法,SSAS 将在最新版本中支持。
勘误:第444页,表格里面关于all函数的表函数的解释“返回列或表的所有不重复值”。all函数作用于表时,应该是返回整个表,而不是不重复的值吧?我试验测试出来也是返还整个表。
第93页中的第四段,“all函数将忽略筛选上下文,并始终返回表的所有行”,这个应该是正确的。
不知道是不是理解有误,还望高老师指正
你好老师,在第二版的第五章理解calculate中的all函数一节中,161页书中说all函数作为calculate函数的调节器,作用于筛选器参数之前,书中图例5-40的也在说明,all函数清除所有的筛选器,但后面的一段关于all和keepfilters同时存在的代码案例里,却解释all只清除了keepfilters的作用,而保留了对颜色的筛选,这不就矛盾了吗,还望解答,感谢
高飞老师,书中第421页:“图14-3所示的图表在水平方向上列出了模型的所有列,在垂直方向上有列出了那个表。”这个表达是不是反了?我看水平方向(横向)显示的是表的名称,而垂直方向(纵向)显示的是模型中的列名。
P230也图8-18中YOU sales在PYsales 无值时应该显示为空,而不是有值
249页的代码VAR Different year = (Selection end of year >= LastInSelection)这个变量的运算是啥?后面一个变量VAR Last day previous year =DATE(YEAR(LastInSelection)-DifferentYear, ,)引用了这个变量,目的是啥?没看懂?是少了啥运算么?
高飞老师,你好!第125页中的图5-19,【删除类别筛选器】是否有误解,个人感觉应该表述为【清除Sales事实表的全部筛选】
第392页,图13-14下面那段,按默认的降序排列感觉不太对。order by默认是按升序排列。
P50中,示例代码中“RELATED ( ‘Product Category'[Category] ) = “Cell Phones””,而示例文件中为“Cell Phone”。
P349 倒数第7行,“考虑计算占总销售额15%的产品集合”,应该是“前15%”,从大到小的前15%的产品集合。
P326
使用keepfilters后, Total仍然没有求平均值. DAX代码有错误, 我蚌埠住了呀, 又能求平均值了? 这是为什么! 我找到原因了, 我哭辽
315页第二行表名应该是Sales,即DISTINCT(Sales[CustomerKey])
第105页倒数第二段:related函数用于”多”端,应该是“一”端吧?relatedtable 应该是“多端”吧?
老师你好
圣经第二版
2021年5月第3次印刷
306页
test: 灰框下面那段
因此,customer[city]显示列的所有可能值,即使筛选器在此列上处于活动状态,并且测试度量值返回true
1,这里 所有可能值,是不是理解为:所有可见值
这样会不会更符合test这个度量址想表达的场景
当然结合上下文 也能理解这里 所有可能值的意思
2, 测试度量值是否能写成 test度量值,这样更能一样看出就是灰框中的test
3,本节讲iscrossfiltered为交叉筛选,但令人感觉 他其实是做的穿透,或者将筛选器平移 传递
是否将来的版本,以及极客(极客这个知识点我还没看)能做下补充说明,或者有更贴切的名称,因为说是交叉筛选的话,特别容易和多对多混淆
第二版圣经,2021年3月第一版,5月第三次印刷
第 225 页
第一段:“另一个有用的函数是PARALLELPERIOD……”这段的第三行:“
但是使用PARALLEPERIOD……”
这里parallel少了一个l,写成PARALLE PERIOD
第125页 图5-19 ALL(Salse)删除类别筛选器, 应是删除Salse表的全部筛选器!
第43页 COUNT仅在数值列上运行。但DAX参考官网介绍,COUNT 函数对包含以下类型的值的行进行计数:数字、日期、字符串。二者是否矛盾?
140页:图5-31里面的应该是度量值公式,Sales Amout:=,少了一个冒号。
p519页,第4、6行:往后平移一年。
按照中文习惯是否应该写成“往前平移一年”,原文 “Finally, CALCULATE uses this value to compute the sales in the previous year
combining two filters: the current selection moved one year back and every day before August 15, 2008.”
第100页,第4段(图4-22下面第2段)中:请注意,关系链中的单个双向关系并不会使整个关系的传递“处处”变为双向。
第241页,第4段第1行 STARTOFFMONTH 中多写了个 F