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

DAX权威指南中文版勘误更新

为了确保中文版及其配套内容的持续准确性,本页用于发布指南中已知的勘误,以下是经译者审核并确认的错误,分为翻译错误和因软件功能更新产生的过时描述,如果您发现了以下两个部分都没有包含的新问题,请留言告知,谢谢。

中文版勘误

    • 第 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 页 最后一段的倒数第三行,在第 4 章中」应为「在第 4 章和第 5 章中」2
    • 第 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 页 第一个代码块少了一个 in,正确写法如下:
      CALCULATE (
          CALCULATE ( 
          ..., 
         	Product[Color] IN { "Yellow", "Black" } 
        ),
        Product[Color] IN { "Black", "Blue" }
      )
      
    • 第 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]
    • 第 231 页 第二个代码块,第一行的度量值名称多了中括号2
      应为 MAT Sales :=
    • 第 241 页 第四段第一行的函数 STARTOFFMONTH 多了一个 F3
      应为 STARTOFMONTH
    • 第 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
    • 第 351 页 使用 SUMMARIZE 函数一节的第二段,「以计算不同颜色的 … 其中分别显示所有颜色的产品数量 …」中红色部分表述有误,应为 所有产品的颜色数量3
    • 第 386 页 最后一段,「SUMMARIZECOLUMNS 还提供了使用 ROLLUPADDSUBTOTAL 和…」中第二个函数名称有误2
      应为 「SUMMARIZECOLUMNS 还提供了使用ROLLUPADDISSUBTOTAL和 ROLLUPGROUP 计算小计的选项」
    • 第 397 页 最后一个代码块中 ProductsSold 变量使用的 SUMMAR1IZE 中间多了一个 1,应去掉2
    • 第 447 页和 448 页 两个页面的代码块中的 AddC2 变量所使用的新建列名称[C2]有误,应为 C2(去掉中括号)3
    • 第 508 页 第一段中「请注意,KEEPFILTERS 是必须的;否则…」表述有误2
      应为 请注意,KEEPFILTERS 可以省略,因为 DateKey 列并非日期类型,即使被作为关系列,也无法覆盖来自外部的筛选上下文,可以正常和月份筛选器求交集。
    • 第 520 页 第二段第三行,「此时 CALCULATE第二个参数强制要求日期必须…」中的第二个应为第三个3
    • 第 527 页 第二段,「SQL 可以使用UPER和 LOWER 管理字符串变换」中的 UPER 应为 UPPER3

功能更新

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


 

30
说点什么

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

成员
158****3828

P150,第一段第二行,原文是”如果想重写代码,…”,改为”如果不想重写代码,…”

游客
桑枝牛

请问54页的下半区域,“你会越来越多地通过在度量值中使用计算表和复杂的【表达式】”, 这里有两个连续的【表】字,是错误还是特意这样写的呢? 求老师解惑

成员
139****0559

老师,书上174页WorkingDaysIn2008的写法返回的是所有可能组合(经测试剔除该条件计算结果不变)
CALCULATETABLE先在原始上下文中计算筛选器参数,然后在新的筛选上下文中计算第一个参数,由于第一个参数用的是ALL,所以返回了所有可能的组合,不知我的理解是否正确?

我想了两种写法,一种是把ALL换成SUMMARIZE,还有一种是把CALCULATETABLE改成FILTER

CALCULATETABLE (
SUMMARIZE ( ‘Date’, ‘Date'[Calendar Year], ‘Date'[IsWorkingDay] ),
‘Date'[Calendar Year] = “CY 2008”,
‘Date'[IsWorkingDay] = TRUE ()
)

FILTER(
ALL(‘Date'[Calendar Year], ‘Date'[IsWorkingDay] ),
AND(
‘Date'[Calendar Year] = “CY 2008”,
‘Date'[IsWorkingDay] = TRUE ()
)
)

微信图片_20210417203358.png
成员
跑//

非常棒!!!