内容:

不要害怕关系中的计算

  • 版本 :2022.1 及更高版本

计算可能令人生畏。使用关系的数据源中的计算看起来可能更吓人。但是没有理由害怕关系中的计算。

注意:如果您还不太适应使用关系的数据源背后的原理,则在深入探讨本主题之前阅读不要害怕关系可能会有所帮助。

计算类型

行级计算针对数据中的每条记录进行运算。例如,每个销售交易都有一个销售金额,即价格,可能会通过折扣百分比进行调整:Price * (1- ZN([Discount]))。这是为每个交易逐行计算的,结果可以认为是在销售金额数据源中添加了一个新列。

还有聚合计算。聚合计算在可视化项的详细级别进行运算,其值取决于视图的结构。计数是聚合计算的一个示例。Count([Title]) 的值取决于我们是按格式、作者还是销售日查看计数。

有关计算类型的详细信息,请参见我们的博客(链接在新窗口中打开)

表详细级别

因为 Tableau 数据源中的每一个表都可以有自己的详细级别,因此计算与哪个表关联会产生很大的影响。例如,过去在 Tableau 中(2020.2 之前,关系之前的版本),可以通过使用常量值 1 创建计算并求和来对数据源中的记录数进行计数。1 分配给数据源中的每一行,因此总和等于行数。

但是,现在该计算的值为 1。整个数据源没有全局详细级别,并且常量计算位于“数据”窗格底部的未分配区域中。它有自己的详细级别。对 1 进行求和就是 1

如前所述,与表具有相同详细级别的计算(通常是因为它们包含表中的字段)应归入“数据”窗格中的该表。例如,将名字和姓氏级联在一起得到每个作者的全名的计算(即 [First Name] + " " + [Last Name])放在作者表中。

但是,如果我们在一个计算中使用多个表中的字段,则计算将转到“数据”窗格底部的未分配区域。这称为跨表行级计算;它需要相关的表的行级联接,这可能会影响性能。(确保在关系的“性能选项”中设置了正确的关联基数)。

分配详细级别

由于表的详细信息级别控制计算结果的表示,因此相应的表中有计算非常重要。FIXED 详细级别表达式可用于将计算拉入特定表。表达式固定到的字段(维度声明(链接在新窗口中打开))确定了结果的详细级别。

示例:作者图书巡展

:每位作者参加多少次图书巡展?

答:此编号应“属于”每个作者,因此应放在作者表中。

  • Author Book Tour Events = {FIXED [Author Name] : SUM([Book Tour Events])}

  • (这可以简单地理解为“对每个作者来说,与他们关联的图书巡展活动的总数”)

:有多少作者没有进行任何图书巡展?

:尝试这样的计算是诱人的

  • COUNTD(IF ISNULL([Book Tour Events]) THEN ([Author Name]) END)

  • (这可以简单地理解为“如果“Book Tour Events”(图书巡展活动)为事件为 null,则返回作者的姓名。对每个唯一作者姓名进行计数”)

但是,这是一个跨表行级计算,因为图书巡展活动来自系列表,作者姓名来自作者表。这样的跨表计算使用内部联接,这意味着当两个表中没有相应的值时,会从联接结果中删除行。这反过来又意味着我们要求 Tableau 对不存在的内容进行计数。但是请注意,如果两个字段在同一个表中,这将是一个很好的方法。目前的计算没有任何问题,除了它不能很好地适应数据源的结构。

相反,我们需要指出每个作者是否存在图书巡展活动,并将这些结果保留在作者表中。一旦每个作者被标记为“参与图书巡展”或不参与,我们就可以计算未参与图书巡展的作者数量。

  • 图书巡展参与者?= IF {FIXED [Author Name]: COUNT([Book Tour Events])} = 0 THEN "No" ELSE "Yes" END

  • (这可以简单地理解为“对于每个作者,对图书巡展活动数量进行计数。如果该计数为零,则将作者标记为“No”,否则将他们标记为“Yes”。通过将字段命名为“Book tour participant?”(图书巡展参与者?,标记为“No”的作者和标记为 “Yes”的作者将排列出来。)

现在,我们可以对“No” 的数量进行计数,并回答原始问题。

如果我们的计算为 Authors without book tours = IF [Book tour participant?]= "No" THEN ([Author Name]) END,我们将获得未参与图书巡展的作者的列表。(这可以理解为“对于‘Book tour participant?’(图书巡展参与者?)为 no 的每个作者,列出作者的姓名。”)

如果我们的计算为 COUNTD(IF [Book tour participant?]= "No" THEN ([Author Name]) END),我们将得到一个位于数据窗格底部未分配区域中的数字答案。为何会这样?因为此计算是聚合计算。

附加问题:

也可以直接使用“Book tour participant?”(图书巡展参与者?)计算的结构返回作者姓名的列表。IF {FIXED [Author Name]: COUNT([Book Tour Events])} = 0 THEN ([Author Name]) END。此计算将位于“数据”窗格中的何处?为何会这样?在您自己的 Tableau Desktop 副本中试用,或下载此工作簿进行查看。(需要 Tableau Desktop 2020.2 或更高版本。进入工作簿后,右键单击“数据”窗格中的计算,并选择“编辑”以打开计算编辑器并查看计算注释中的说明。)

相关资源

感觉有点不知所措, 想退回去一步吗?请尝试不要害怕关系

准备好继续探索如何使用关系进行复杂的分析了吗?请查看不要害怕更深层次的关系

有关直接来自产品管理团队的关系的技术基础的详细信息,请查看 Tableau 博客上有关关系的系列文章。

另请参见 Action Analytics(链接在新窗口中打开) 中有关关系的视频播客,例如为什么 Tableau 发明了关系?(链接在新窗口中打开)单击 Library(库)(链接在新窗口中打开)中的“Video Podcast”(视频播客)以查看更多信息。