# Aggr - 图表函数

Aggr() 用于返回在声明维度或维度上计算的表达式的值的阵列。例如，每个区域的每位客户的最大销售额值。

Aggr 函数用于嵌套聚合，其中每个维度值计算一次其第一个参数（内部聚合）。维度在第二个参数（以及后续参数）中指定。

此外，其中在外部聚合函数中要将 Aggr 函数括起来，从而将 Aggr 函数的结果阵列用作其所嵌套的聚合的输入。

语法：

Aggr({SetExpression}[DISTINCT] [NODISTINCT ] expr, StructuredParameter{, StructuredParameter})

返回数据类型： 双

参数：

参数

| 参数 | 描述 |
| --- | --- |
| expr | 表达式包含聚合函数。聚合函数会默认聚合选择项定义的可能记录集合。 |
| StructuredParameter | StructuredParameter 包括维度并可选地包括排序标准，格式为：`(Dimension(Sort-type, Ordering))`<br><br>维度是一个单一字段，并且不能为表达式。维度用于确定为其计算表达式 Aggr 的值的阵列。<br><br>如果包含排序标准，则会将对维度计算的 Aggr 函数创建的值的阵列排序。如果排序顺序会影响其中包含 Aggr 函数的表达式的结果，则这点很重要。<br><br>有关如何使用排序标准的详细信息，请参阅[向结构化参数中的维度添加排序标准](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/ChartFunctions/aggr.htm#Sorting)。 |
| SetExpression | 聚合函数会默认聚合选择项定义的可能记录集合。可选记录集合可由集合分析表达式定义。 |
| DISTINCT | 如果表达式参数前面是 distinct 限定符，或者根本没有使用限定符，则维度值的每个特殊组合只生成一个返回值。这是实现聚合的常规方式 – 维度值的每个特殊组合将在图表中占用一行。 |
| NODISTINCT | 如果表达式参数前面是 nodistinct 限定符，各维度值组合可能生成多个返回值，具体取决于基础数据结构。如果只有一个维度，则 aggr 函数将返回元素数量与源数据中的行数相同的阵列。 |

基本聚合函数，例如 Sum、Min 和 Avg，在比较 Aggr() 函数以创建可产生另一个聚合的临时阶段性结果集合（虚拟表）时返回单个数值。例如，通过在 Aggr() 语句中按客户通过合计销售额计算平均销售额值，然后计算总和结果的平均值：Avg(TOTAL Aggr(Sum(Sales),Customer))。

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

限制：

Aggr() 函数中的每个维度必须是单个字段，不能是表达式（计算维度）。

[](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/ChartFunctions/aggr.htm)向结构化参数中的维度添加排序标准

在其基本形式中，参数 StructuredParameter 在 Aggr 函数语法中是单维度。表达式：Aggr(Sum(Sales, Month)) 查找每个月销售额的总计值。但是，当包含在另一个聚合函数中时，如果不使用排序标准，将存在意外的结果。这是因为某些维度可按数字或字母等排序。

在 StructuredParameter 参数中（位于 Aggr 函数内），您可在表达式中指定有关维度的排序标准。由此，可在 Aggr 函数生成的虚拟表格上使用排序顺序。

参数 StructuredParameter 有以下语法：

(FieldName, (Sort-type, Ordering))

可以嵌套结构化参数：

(FieldName, (FieldName2, (Sort-type, Ordering)))

排序类型可为：NUMERIC、TEXT、FREQUENCY 或 LOAD\_ORDER。

和每个排序类型相关的顺序类型如下：

允许的顺序类型

| 排序类型 | 允许的顺序类型 |
| --- | --- |
| NUMERIC | ASCENDING、DESCENDING 或 REVERSE |
| TEXT | ASCENDING、A2Z、DESCENDING、REVERSE 或 Z2A |
| FREQUENCY | DESCENDING、REVERSE 或 ASCENDING |
| LOAD\_ORDER | ASCENDING、ORIGINAL、DESCENDING 或 REVERSE |

顺序类型 REVERSE 和 DESCENDING 相同。

对于排序类型 TEXT，顺序类型 ASCENDING 和 A2Z 相同，而 DESCENDING、REVERSE 和 Z2A 相同。

对于排序类型 LOAD\_ORDER，顺序类型 ASCENDING 和 ORIGINAL 相同。

## 示例 - 使用 Aggr 的图表表达式

[](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/ChartFunctions/aggr.htm)

#### 示例 - 图表表达式

### 图表表达式示例 1

#### 加载脚本

将以下数据作为数据加载编辑中的内联加载载入，以创建以下图表表达式示例。

```
ProductData:

LOAD * inline [
Customer|Product|UnitSales|UnitPrice
Astrida|AA|4|16
Astrida|AA|10|15
Astrida|BB|9|9
Betacab|BB|5|10
Betacab|CC|2|20
Betacab|DD|25|25
Canutility|AA|8|15
Canutility|CC|0|19
] (delimiter is '|');
```

有关使用内联加载的详细信息，请参见[使用内联加载来加载数据](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/inline-loads-qs.htm)。

#### 图表表达式

在 Qlik Sense 工作表中创建 KPI 可视化。在 KPI 中添加以下表达式作为度量：

`Avg(Aggr(Sum(UnitSales*UnitPrice), Customer))`

#### 结果

376.7

#### 解释

表达式 `Aggr(Sum(UnitSales*UnitPrice), Customer)` 按 Customer 查找销售额总计值，并返回值阵列：对于 Customer 值为 295、715 和 120。

实际上，我们创建了临时的值列表，而不必创建包含这些值的明确的表格或列。

这些值可用作 Avg() 函数的导入值，以查找销售额平均值 376.7。

有关表达式的更多信息，请参阅[在可视化中使用表达式](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/ChartFunctions/use-expressions-in-visualizations.htm)。

### 图表表达式示例 2

#### 加载脚本

将以下数据作为数据加载编辑中的内联加载载入，以创建以下图表表达式示例。

```
ProductData:

LOAD * inline [
Customer|Product|UnitSales|UnitPrice
Astrida|AA|4|16
Astrida|AA|10|15
Astrida|BB|10|15
Astrida|BB|9|9
Betacab|BB|5|10
Betacab|BB|7|12
Betacab|CC|2|22
Betacab|CC|4|20
Betacab|DD|25|25
Canutility|AA|8|15
Canutility|AA|5|11
Canutility|CC|0|19
] (delimiter is '|');
```

有关使用内联加载的详细信息，请参见[使用内联加载来加载数据](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/inline-loads-qs.htm)。

#### 图表表达式

创建一个以 Customer、Product、UnitPrice 和 UnitSales 为维度的 Qlik Sense 工作表中的表格可视化。在表格中添加以下表达式作为度量：

`Aggr(NODISTINCT Max(UnitPrice), Customer, Product)`

#### 结果

| Customer | Product | UnitPrice | UnitSales | Aggr(NODISTINCT Max(UnitPrice), Customer, Product) |
| --- | --- | --- | --- | --- |
| Astrida | AA | 15 | 10 | 16 |
| Astrida | AA | 16 | 4 | 16 |
| Astrida | BB | 9 | 9 | 15 |
| Astrida | BB | 15 | 10 | 15 |
| Betacab | BB | 10 | 5 | 12 |
| Betacab | BB | 12 | 7 | 12 |
| Betacab | CC | 20 | 4 | 22 |
| Betacab | CC | 22 | 2 | 22 |
| Betacab | DD | 25 | 25 | 25 |
| Canutility | AA | 11 | 5 | 15 |
| Canutility | AA | 15 | 8 | 15 |
| Canutility | CC | 19 | 0 | 19 |

#### 解释

值阵列：16、16、15、15、12、12、22、22、25、15、15 和 19。nodistinct 限定符意味着阵列包含源数据中每行的一个元素：每个值都是每个 Customer 和 Product 的最高 UnitPrice。

### 图表表达式示例 3

#### 加载脚本

将以下数据作为数据加载编辑中的内联加载载入，以创建以下图表表达式示例。

```
Set vNumberOfOrders = 1000;

OrderLines:
Load
	RowNo() as OrderLineID,
	OrderID,
	OrderDate,
	Round((Year(OrderDate)-2005)*1000*Rand()*Rand()*Rand1) as Sales
	While Rand()<=0.5 or IterNo()=1;
Load * Where OrderDate<=Today();
Load 
	Rand() as Rand1,
	Date(MakeDate(2013)+Floor((365*4+1)*Rand())) as OrderDate,
	RecNo() as OrderID
	Autogenerate vNumberOfOrders;
    
Calendar:
Load distinct
	Year(OrderDate) as Year,
	Month(OrderDate) as Month,
	OrderDate 
	Resident OrderLines;
```

#### 图表表达式

在 Qlik Sense 工作表中创建表可视化，以年和月为维度。在表格中添加以下表达式作为度量：

* `Sum(Sales)`
* `Sum(Aggr( Rangesum(Above(Sum(Sales),0,12)), (Year, (Numeric, Ascending)), (Month, (Numeric, Ascending)) ))` 标记为表格中的 Structured Aggr()。

#### 结果

| Year | Month | Sum(Sales) | Structured Aggr() |
| --- | --- | --- | --- |
| 2013 | Jan | 53495 | 53495 |
| 2013 | Feb | 48580 | 102075 |
| 2013 | Mar | 25651 | 127726 |
| 2013 | Apr | 36585 | 164311 |
| 2013 | May | 61211 | 225522 |
| 2013 | Jun | 23689 | 249211 |
| 2013 | Jul | 42311 | 291522 |
| 2013 | Aug | 41913 | 333435 |
| 2013 | Sep | 28886 | 362361 |
| 2013 | Oct | 25977 | 388298 |
| 2013 | Nov | 44455 | 432753 |
| 2013 | Dec | 64144 | 496897 |
| 2014 | Jan | 67775 | 67775 |

#### 解释

此示例按时间升序显示每年 12 个月期间的聚合值，因此是 Aggr() 表达式的结构化参数 (Numeric, Ascending) 部分。需要将两个特定维度作为结构化参数：Year 和 Month，排序为 (1) Year（数字）和 (2) Month（数值）。在表格或图表可视化中必须使用这两个维度。Aggr() 函数的维度列表必须与可视化中使用的对象的维度相对应。

您可在表格中或单独的折线图中比较这些度量之间的差异。

* `Sum(Aggr(
  	Rangesum(Above(Sum(Sales),0,12)), 
  	(Year), 
  	(Month)
  	))`
* `Sum(Aggr(
  	Rangesum(Above(Sum(Sales),0,12)), 
  	(Year, (Numeric, Ascending)), 
  	(Month, (Numeric, Ascending))
  	))`

应该清楚地看到，只有后一个表达式执行所需的聚合值累加。

## 了解详情

* [基本聚合函数](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/AggregationFunctions/basic-aggregation-functions.htm)
* [集合分析](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/ChartFunctions/SetAnalysis/set-analysis-expressions.htm)