从数据到信息
从信息到洞察

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

功能更新

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 将在最新版本中支持。


 

60
说点什么

1000
 
鼓掌微笑开心憧憬爱你色并不觉得吃瓜doge二哈喵喵思考笑哭捂脸悲伤大哭抓狂汗偷笑打脸捂眼黑线问号晕拜拜闭嘴衰咒骂ok作揖
24 评论数
36 被回复的评论
24 订阅评论的人数
 
查看最近回复
查看最热评论
  订阅本文评论  
最新 最旧 得票最多
提醒
成员
132****6442

勘误:第444页,表格里面关于all函数的表函数的解释“返回列或表的所有不重复值”。all函数作用于表时,应该是返回整个表,而不是不重复的值吧?我试验测试出来也是返还整个表。
第93页中的第四段,“all函数将忽略筛选上下文,并始终返回表的所有行”,这个应该是正确的。
不知道是不是理解有误,还望高老师指正

游客
彭政

你好老师,在第二版的第五章理解calculate中的all函数一节中,161页书中说all函数作为calculate函数的调节器,作用于筛选器参数之前,书中图例5-40的也在说明,all函数清除所有的筛选器,但后面的一段关于all和keepfilters同时存在的代码案例里,却解释all只清除了keepfilters的作用,而保留了对颜色的筛选,这不就矛盾了吗,还望解答,感谢

游客
Ouhan

高飞老师,书中第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默认是按升序排列。

游客
Ten

P50中,示例代码中“RELATED ( ‘Product Category'[Category] ) = “Cell Phones””,而示例文件中为“Cell Phone”。

成员
五月未杪

P349 倒数第7行,“考虑计算占总销售额15%的产品集合”,应该是“前15%”,从大到小的前15%的产品集合。

游客
Bridge

P326
使用keepfilters后, Total仍然没有求平均值. DAX代码有错误, 我蚌埠住了呀, 又能求平均值了? 这是为什么! 我找到原因了, 我哭辽

成员
chineselfb

315页第二行表名应该是Sales,即DISTINCT(Sales[CustomerKey])

游客
icelock

第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

成员
guandaxin1

第125页 图5-19 ALL(Salse)删除类别筛选器, 应是删除Salse表的全部筛选器!

游客
guandaxin1

第43页 COUNT仅在数值列上运行。但DAX参考官网介绍,COUNT 函数对包含以下类型的值的行进行计数:数字、日期、字符串。二者是否矛盾?

游客
16565886141

140页:图5-31里面的应该是度量值公式,Sales Amout:=,少了一个冒号。

成员
jonasfrank

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.”

成员
16565886141

第100页,第4段(图4-22下面第2段)中:请注意,关系链中的单个双向关系并不会使整个关系的传递“处处”变为双向。

成员
注视

第241页,第4段第1行 STARTOFFMONTH 中多写了个 F