# 嵌套聚合函数

图表表达式中的任何字段名称必须正好被一个聚合函数包围。如果需要嵌套聚合，可以使用 Aggr() 添加第二聚合级别。Aggr() 包含聚合函数作为参数。

## 总是函数中的一个聚合级别

典型的应用程序可包含：

* 数据中的一百万个记录
* 透视表中的一百行
* 表盘或文本框中的单个 KPI

尽管量级不同，所有三个数字仍然表示所有数据。数字仅为不同的聚合级别。

聚合函数使用来自多个记录的值作为输入，并将这些值转换为一个单独的值，该值可视为所有记录的摘要。存在一个限制：不能在另一个聚合函数中使用聚合函数。您通常需要将每个字段引用包含在确切的一个聚合函数中。

以下表达式将有效：

* Sum(Sales)
* Sum(Sales)/Count(Order Number)

以下表达式将不起作用，因为它是嵌套聚合：

* Count(Sum(Sales))

这个问题的解决方法是 Aggr() 形式的函数。与其名称相反，它不是聚合函数。它是一个“多对多”函数，更像是数学中的矩阵。其将具有 N 个记录的表格转换成具有 M 个记录的表格。其返回值的数组。它也可以被看作具有一个度量单位和一个或多个维度的虚拟垂直表。

提示注释如果想要创建多层次嵌套图表聚合，则在计算维度中使用 Aggr() 函数。

## 将 Aggr() 用于嵌套聚合函数

Aggr() 用于返回在声明维度或维度上计算的表达式的值的阵列。例如，每个区域的每位客户的最大销售额值。在高级聚合中，其中在另一个聚合函数中要将 Aggr() 函数括起来，从而将 Aggr() 函数的结果阵列用作其所嵌套的聚合的输入。

当使用它时，Aggr() 语句生成一个虚拟表，其中一个表达式按一个或多个维度分组。然后可通过外部聚合函数进一步聚合该虚拟表的结果。

## 计算最大的平均订单价值

让我们在图表表达式中使用简单的 Aggr() 语句。

我们希望在区域级别看到我们的总体指标，但也要显示两个更复杂的表达式：

* 每个区域内按经理划分的最大平均订单价值。
* 对该最大平均订单价值负责的经理。

我们可以使用标准表达式 Sum(Sales)/Count([Order Number]) 方便地计算每个地区的平均订单价值。

在应用程序内，在 Nested Aggregations 工作表上您将找到标题为 Aggr() function 的表格。

执行以下操作：

1. 选择可用的 Aggr() function 表格。  
   属性面板打开。
2. 单击添加列并选择度量。
3. 单击 the 表达式 icon 符号。  
   表达式编辑器打开。
4. 输入以下内容：Sum(Sales)/Count([Order Number])
5. 单击应用。

以表格示出每个地区的平均订单价值。

![以表格示出每个地区的平均订单价值。](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Resources/Images/tutorial-aggr-table1.png)

提示注释作为最佳实践，请确保您的数据格式正确。在该情况下，在每个列中我们将更改标签以表示计算。在具有货币值的列中，我们将数字格式更改为货币，并将格式样式更改为 $ #,##0;-$ #,##0。

我们的目标是检索每个地区的最大平均订单价值。我们必须使用 Aggr() 告知 Qlik Sense，我们希望获取每个地区每个经理的平均订单值，然后显示其中最大的一个。要获得每个地区、每个经理的平均订单值，我们必须在 Aggr() 语句中包括以下维度：

Aggr(Sum(Sales)/Count([Order Number]), Region, Manager)

该表达式导致 Qlik Sense 生成如下所示的虚拟表

示出每个地区每个经理的平均订单价值的 Aggr() 函数的虚拟表。

![示出每个地区每个经理的平均订单价值的  AGGR 函数的表。](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Resources/Images/tutorial-aggr-table2.png)

当 Qlik Sense 计算每个地区每个经理的单个平均订单值时，我们需要找到这些值中最大的一个。我们通过用 Max() 环绕 Aggr() 函数来进行该操作。

Max(Aggr(Sum(Sales)/Count([Order Number]), Manager, Region))

执行以下操作：

1. 单击添加列并选择度量。
2. 单击 the 表达式 icon 符号。  
   表达式编辑器打开。
3. 输入以下内容：Max(Aggr(Sum(Sales)/ Count([Order Number]), Manager, Region))
4. 单击应用。

以表格示出地区、每个地区每个经理的平均订单价值以及最大平均订单价值。

![以表格示出地区、每个地区每个经理的平均订单价值以及最大平均订单价值。](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Resources/Images/tutorial-aggr-table3.png)

您可以看到所有经理在地区级别的最大平均订单值。这是我们两个复杂表达式中的第一个！下一个要求是让负责这些较大平均订单价值的经理的姓名自行显示在这些值旁边。

为此，我们将如前使用同一 Aggr() 函数，但是这次将连同 FirstSortedValue() 函数一起使用。FirstSortedValue() 函数告知 Qlik Sense 针对函数第二部分中指定的特定维度为我们提供经理：

FirstSortedValue(Manager,-Aggr(Sum(Sales)/Count(Order Number), Manager, Region))

提示注释表达式有一个很小但很重要的部分：Aggr() 表达式前面的减号。在 FirstSortedValue() 函数内，您可指定数据数组的排序顺序。在该情况下，减号符号告知 Qlik Sense 从最大到最小排序。

执行以下操作：

1. 单击添加列并选择度量。
2. 单击 the 表达式 icon 符号。  
   表达式编辑器打开。
3. 输入以下内容：FirstSortedValue(Manager,-Aggr(Sum(Sales)/ Count([Order Number]), Manager, Region))
4. 单击应用。

以表格示出地区、每个地区的平均订单价值和最大平均订单价值，以及负责该订单价值的经理。

![以表格示出地区、每个地区的平均订单价值和最大平均订单价值，以及负责该订单价值的经理。](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Resources/Images/tutorial-aggr-table.png)

有关详细信息，请参阅 [Aggr](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/ChartFunctions/aggr.htm)。

有关更多信息，请参阅 [FirstSortedValue](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/ChartFunctions/BasicAggregationFunctions/firstsortedvalue.htm)