

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 添加计算字段


使用以下一项或多项创建计算字段以转换数据：
+ [运算符](arithmetic-and-comparison-operators.md)
+ [函数](functions.md)
+ 聚合函数（只能将这些函数添加到分析中）
+ 包含数据的字段
+ 其他计算字段

您可以在数据准备期间或从分析页面中向数据集添加计算字段。如果在数据准备期间将计算字段添加到数据集中，则可以在使用该数据集的所有分析中使用该字段。在将一个计算字段添加到分析中的数据集时，只能在此分析中使用该字段。

分析同时支持单行操作和聚合操作。单行操作是指为每行提供 (可能) 不同的结果的操作。聚合操作提供的结果始终与整个行集相同。例如，如果您使用不带任何条件的简单字符串函数，它将更改每一行。如果您使用聚合函数，该规则将应用于组中的所有行。如果要查询美国的总销售额，则相同的数量应用于整个集合。如果需要特定状态的数据，则总销售额会反映新分组。它仍将为整个集合提供一个结果。

通过在分析内创建聚合的计算字段，您可以深入了解数据。在每个级别相应地重新计算聚合字段的值。数据集准备期间不能有这种类型的聚合。

例如，假设您要计算每个国家/地区、区域和州/省的利润百分比。您可以在分析中添加计算字段，`(sum(salesAmount - cost)) / sum(salesAmount)`。随后，在分析师深入到地理位置时，将计算每个国家/地区、区域和州/省的该字段。

**Topics**
+ [

## 将计算字段添加到分析
](#using-the-calculated-field-editor-analysis)
+ [

## 将计算字段添加到数据集
](#using-the-calculated-field-editor)
+ [

## 处理计算字段中的十进制值
](#handling-decimal-fields)

## 将计算字段添加到分析


当您将数据集添加到分析中时，数据集中存在的每个计算字段都会添加到分析中。您可以在分析级别添加其他计算字段，以创建仅在该分析中可用的计算字段。

**将计算字段添加到分析**

1. 打开 [Quick 控制台](https://quicksight.aws.amazon.com/)。

1. 打开要更改的分析。

1. 在**数据**窗格中，选择左上角的**添加**，然后选择 **\$1 计算字段**。

   1. 在打开的计算编辑器中，执行以下操作：

   1. 为计算字段输入名称。

   1. 使用数据集、函数和运算符中的字段输入公式。

1. 完成后，选择**保存**。

有关如何使用 Quick Sight 中的可用函数创建公式的更多信息，请参阅[Amazon Quick 的计算字段函数和运算符参考函数和运算符](calculated-field-reference.md)。

## 将计算字段添加到数据集


Amazon Quick Sight 作者可以在数据集创建的数据准备阶段生成计算字段。当您为数据集创建计算字段时，该字段将成为数据集中的新列。所有使用该数据集的分析都会继承该数据集的计算字段。

如果计算字段在行级别运行，并且数据集存储在行级别SPICE，则 Quick Sight 会在中计算并具体化结果。SPICE如果计算字段依赖于聚合函数，Quick Sight 会保留公式并在生成分析时执行计算。此类计算字段称为非具体化计算字段。

**为数据集添加或编辑计算字段**

1. 打开您希望使用的数据集。有关更多信息，请参阅 [编辑数据集](edit-a-data-set.md)。

1. 在“数据准备”页面上，执行以下操作：
   + 要创建新字段，请选择左侧的**添加计算字段**。
   + 要编辑现有的计算字段，请从左侧的**计算字段**中选择该字段，然后从上下文（右键单击）菜单中选择**编辑**。

1. 在计算编辑器中，为**添加标题**输入描述性名称来命名新的计算字段。此名称出现在数据集的字段列表中，因此应与其他字段相似。在本示例中，我们将字段命名为 `Total Sales This Year`。

1. （可选）添加注释，例如用斜杠和星号将文本括起来，以说明表达式的作用。

   ```
   /* Calculates sales per year for this year*/
   ```

1. 确定要使用的指标、函数和其他项目。在本示例中，我们需要确定以下内容：
   + 要使用的指标
   + 函数：`ifelse` 和 `datediff`

   我们想构建一个语句，类似于“如果销售发生在今年，则显示总销售额，否则显示 0。”

   要添加 `ifelse` 函数，请打开**函数**列表。选择**全部**以关闭所有函数的列表。现在，您应该会看到函数组：**聚合**、**条件**、**日期**等。

   选择**条件**，然后双击 `ifelse` 将其添加到工作区。

   ```
   ifelse()
   ```

1. 将光标放在工作区的括号内，然后添加三个空白行。

   ```
   ifelse(
                                               
                                               
                                               
   )
   ```

1. 将光标放在第一个空白行上，找到 `dateDiff` 函数。它列在**日期**下的**函数**中。您也可以通过输入 **date** 使用**搜索功能**查找。`dateDiff` 函数返回名称中包含 *`date`* 的所有函数。它不会返回**日期**下列出的所有函数；例如，搜索结果中缺少 `now` 函数。

   双击 `dateDiff` 将其添加到 `ifelse` 语句的第一个空白行。

   ```
   ifelse(
   dateDiff()                                            
                                               
                                               
   )
   ```

   添加 `dateDiff` 使用的参数。将光标放在 `dateDiff` 括号内以开始添加 `date1`、`date2` 和 `period`：

   1. 对于 `date1`：第一个参数是包含日期的字段。在**字段**下找到它，然后双击它或输入其名称将其添加到工作区。

   1. 对于 `date2`，添加逗号，然后选择 `truncDate()` 作为**函数**。在括号内添加周期和日期，如下所示：**truncDate( "YYYY", now() )**

   1. 对于 `period`：在 `date2` 后面添加逗号并输入 **YYYY**。这是一年的周期。要查看所有支持的周期列表，在**函数**列表中找到 `dateDiff`，然后选择**了解更多**以打开文档。如果您已经像现在一样查看文档，请参阅 [dateDiff](dateDiff-function.md)。

   如果您愿意，可以添加一些空格以提高可读性。表达式应如下所示。

   ```
   ifelse(
      dateDiff( {Date}, truncDate( "YYYY", now() ) ,"YYYY" )                                       
                                               
                                               
   )
   ```

1. 指定返回值。在我们的示例中，`ifelse` 中的第一个参数需要返回 `TRUE` 或 `FALSE` 的值。因为我们想要当前年份，并且将其与今年进行比较，所以指定 `dateDiff` 语句应返回 `0`。对于销售年份和当前年份之间没有区别的行，`ifelse` 的 `if` 部分评估为 true。

   ```
      dateDiff( {Date}, truncDate( "YYYY", now() ) ,"YYYY" ) = 0 
   ```

   要为去年 `TotalSales` 创建字段，可以将 `0` 更改为 `1`。

   使用 `addDateTime` 而不是 `truncDate`，也能达到同样的目的。然后，对于之前的每一年，更改 `addDateTime` 的第一个参数来代表每一年。为此，您可以使用 `-1` 表示去年，`-2` 表示之前的一年，依此类推。如果您使用 `addDateTime`，则将每年的 `dateDiff` 函数保留为 `= 0`。

   ```
      dateDiff( {Discharge Date}, addDateTime(-1, "YYYY", now() ) ,"YYYY" ) = 0 /* Last year */
   ```

1. 将光标移到 `dateDiff` 下方的第一个空白行。添加逗号。

   对于 `ifelse` 语句的 `then` 部分，我们需要选择包含销售额的度量（指标）`TotalSales`。

   要选择字段，打开**字段**列表，然后双击字段将其添加到屏幕上。或者可以输入名称。在包含空格的名称周围添加大括号 `{ }`。您的指标可能有不同的名称。您可以通过字段前面的数字符号（**\$1**）判断哪个字段是指标。

   现在，表达式应如下所示。

   ```
   ifelse(
      dateDiff( {Date}, truncDate( "YYYY", now() ) ,"YYYY" ) = 0
      ,{TotalSales}                            
                                              
   )
   ```

1. 添加 `else` 子句。`ifelse` 函数不需要子句，但我们想添加。出于报告的目的，您通常不希望有任何 null 值，因为有时会省略带 null 值的行。

   我们将 ifelse 的其余部分设置为 `0`。结果是，对于包含往年销售额的行，该字段为 `0`。

   为此，请在空白行上添加一个逗号，然后添加 `0`。如果您在开头添加了注释，则最终 `ifelse` 表达式应如下所示。

   ```
   /* Calculates sales per year for this year*/
   ifelse(
      dateDiff( {Date}, truncDate( "YYYY", now() ) ,"YYYY" ) = 0
      ,{TotalSales}                            
      ,0                                         
   )
   ```

1. 选择右上角的**保存**以保存您所做的工作。

   如果表达式中有错误，编辑器会在底部显示错误消息。检查表达式中是否有红色的波浪线，然后将光标悬停在该行上以查看错误消息内容。常见错误包括标点符号缺失、参数缺失、拼写错误和数据类型无效。

   要避免进行任何更改，请选择**取消**。

**将参数值添加到计算字段**

1. 您可以在计算字段中引用参数。通过将参数添加到表达式中，可以添加该参数的当前值。

1. 要添加参数，打开**参数**列表，然后选择要包含其值的参数。

1. （可选）要手动向将参数添加到表达式，请键入参数的名称。然后用大括号 `{}` 将其括起来，并加上 `$` 前缀，例如 `${parameterName}`。

您可以更改数据集中任何字段的数据类型，包括计算字段的类型。您只能选择与字段中的数据相匹配的数据类型。

**更改计算字段的数据类型**
+ 对于**计算字段**（左侧），选择要更改的字段，然后从上下文（右键单击）菜单中选择**更改数据类型**。

与数据集中的其他字段不同，计算字段无法禁用。相反，可以将其删除。

**删除计算字段**
+ 对于**计算字段**（左侧），选择要更改的字段，然后从上下文（右键单击）菜单中选择**删除**。

## 处理计算字段中的十进制值


当您的数据集使用直接查询模式时，十进制数据类型的计算由数据集来源引擎的行为决定。在某些特定情况下，Quick Sight 会应用特殊处理来确定输出计算的数据类型。

当您的数据集使用 SPICE 查询模式并且计算字段被具体化时，结果的数据类型取决于特定的函数运算符和输入的数据类型。下表显示了一些数值计算字段的预期行为。

**一元运算符**

下表显示了根据您使用的运算符和输入值的数据类型输出哪种数据类型。例如，如果您在 `abs` 计算中输入一个整数，则输出值的数据类型为整数。


****  
[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/quick/latest/userguide/adding-a-calculated-field-analysis.html)

**二元运算符**

下表根据您输入的两个值的数据类型显示输出哪种数据类型。例如，对于算术运算符，如果您提供两个整数数据类型，则计算结果将输出为整数。

对于基本运算符（\$1、-、\$1）：


|  | **整数** | **十进制定点** | **十进制浮点** | 
| --- | --- | --- | --- | 
|  **整数**  |  整数  |  十进制定点  |  十进制浮点  | 
|  **十进制定点**  |  十进制定点  |  十进制定点  |  十进制浮点  | 
|  **十进制浮点**  |  十进制浮点  |  十进制浮点  |  十进制浮点  | 

对于除法运算符（/）：


|  | **整数** | **十进制定点** | **十进制浮点** | 
| --- | --- | --- | --- | 
|  **整数**  |  十进制浮点  |  十进制浮点  |  十进制浮点  | 
|  **十进制定点**  |  十进制浮点  |  十进制定点  |  十进制浮点  | 
|  **十进制浮点**  |  十进制浮点  |  十进制浮点  |  十进制浮点  | 

对于指数运算符和模数运算符（^、%）：


|  | **整数** | **十进制定点** | **十进制浮点** | 
| --- | --- | --- | --- | 
|  **整数**  |  十进制浮点  |  十进制浮点  |  十进制浮点  | 
|  **十进制定点**  |  十进制浮点  |  十进制浮点  |  十进制浮点  | 
|  **十进制浮点**  |  十进制浮点  |  十进制浮点  |  十进制浮点  | 