---
schema_version: "1"
id: 0acf80dc3ba1f1438c312d81d4ea6267ddd88719e3e082d4986cb1dfb4064ee1
title: 不要害怕关系中的计算
collection: tableau
version: current
locale: zh-cn
portal_url: https://docs.salesforce.com/tableau/current/zh-cn/pro/desktop/datasource_dont_be_scared_calcs.md
canonical_url: https://help.tableau.com/current/pro/desktop/zh-cn/datasource_dont_be_scared_calcs.htm
source_site: help.tableau.com
content_type: documentation
content_hash: 172ec2483108ba80f5c45f09d37e68883b1594d753e60d537eb7673ea085d283
description: Understand how calculations work in data sources that use relationships and table-level detail.
---
[跳转到主要内容](#main-content)

# 不要害怕关系中的计算

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

**注意：**如果您还不太适应使用关系的数据源背后的原理，则在深入探讨本主题之前阅读[不要害怕关系](https://help.tableau.com/current/pro/desktop/zh-cn/datasource_dont_be_scared.htm)可能会有所帮助。

## 计算类型

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

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

有关计算类型的详细信息，请参见[我们的博客](https://www.tableau.com/about/blog/2019/9/understanding-how-tableau-calculation-types-work-together)。

## 表详细级别

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

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

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

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

## 分配详细级别

由于表的详细信息级别控制计算结果的表示，因此相应的表中有计算非常重要。FIXED 详细级别表达式可用于将计算拉入特定表。表达式固定到的字段（[维度声明](https://help.tableau.com/current/pro/desktop/zh-cn/calculations_calculatedfields_lod.htm#lod-expression-syntax)）确定了结果的详细级别。

### 示例：作者图书巡展

**问**：每位作者参加多少次图书巡展？

**答：**此编号应“属于”每个作者，因此应放在作者表中。

- **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 副本中试用，或[下载此工作簿](https://help.tableau.com/samples/en-us/bookshop/dontbescared_calcs.twbx)进行查看。（需要 Tableau Desktop 2020.2 或更高版本。进入工作簿后，右键单击“数据”窗格中的计算，并选择“编辑”以打开计算编辑器并查看计算注释中的说明。）

## 相关资源

感觉有点不知所措， 想退回去一步吗？请尝试[不要害怕关系](https://help.tableau.com/current/pro/desktop/zh-cn/datasource_dont_be_scared.htm)。

准备好继续探索如何使用关系进行复杂的分析了吗？请查看[不要害怕更深层次的关系](https://help.tableau.com/current/pro/desktop/zh-cn/datasource_dont_be_scared_deeper.htm)。

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

- [关系，第 1 部分：在 Tableau 中引入新的数据建模](https://www.tableau.com/about/blog/2020/5/relationships-part-1-meet-new-tableau-data-model)
- [关系，第 2 部分：提示和技巧](https://www.tableau.com/about/blog/2020/5/relationships-part-2-tips-and-tricks)
- [关系，第 3 部分：跨多个相关表提出问题](https://www.tableau.com/about/blog/2020/6/relationships-part-3-asking-questions-across-multiple-related-tables)

另请参见 [Action Analytics](https://action-analytics.com/library/) 中有关关系的视频播客，例如[为什么 Tableau 发明了关系？](https://action-analytics.com/ep-1-why-did-tableau-invent-relationships/)单击 [Library（库）](https://action-analytics.com/library/)中的“Video Podcast”（视频播客）以查看更多信息。