# 内部和外部集合表达式

集合表达式可以在聚合函数内外使用，并用花括号括起来。

在聚合函数中使用集合表达式时，它可能如下所示：

示例： 内部集合表达式

```
Sum( {$<Year={2021}>} Sales )
```

如果表达式具有多个聚合，并且希望避免在每个聚合函数中写入相同的集合表达式，请在聚合函数外使用集合表达式。

如果使用外部集合表达式，则必须将其放置在范围的开头。

示例： 外部集合表达式

```
{<Year={2021}>} Sum(Sales) / Count(distinct Customer)
```

如果在聚合函数之外使用集合表达式，也可以将其应用于现有的主度量值。

示例： 应用于主度量值的外部集表达式

```
{<Year={2021}>} [Master Measure]
```

在聚合函数外部使用的集合表达式会影响整个表达式，除非它用括号括起来，否则括号定义范围。在下面的词法范围示例中，集合表达式仅应用于括号内的聚合。

示例： 词法定界

```
( {<Year={2021}>} Sum(Amount) / Count(distinct Customer) ) – Avg(CustomerSales)
```

## 规则

#### 词法定界

除非用括号括起来，否则集合表达式会影响整个表达式。如果是，括号定义词法范围。

#### 位置

集合表达式必须放在词法范围的开头。

#### 上下文

上下文是与表达式相关的选择。传统上，上下文始终是当前选择的默认状态。但如果对象设置为备用状态，则上下文是当前选择的备用状态。

还可以以外部集表达式的形式定义上下文。

#### 继承

内部集合表达式优先于外部集合表达式。如果内部集合表达式包含集合标识符，则它会覆盖外部集合表达式中定义的上下文。否则，将计算内部和外部集合表达式。

示例 1: 带有集合标识符的内部集合表达式

{&lt;Year={2023}&gt;} Sum(Sales) / Count({1} distinct OrderNumber)

在上述表达式中，内部集合表达式 Count({1} distinct OrderNumber) 由集合标识符 {1} 组成。计算此内部集合表达式时，不应用外部集合表达式 {&lt;Year={2023}&gt;} 中定义的范围。

示例 2: 没有集合标识符的内部集合表达式

{&lt;Year={2023}&gt;} Sum ({&lt;Status={'Confirmed'}&gt;} Sales\_Stream1) + Sum ({&lt;UpdatedStatus={'Confirmed'}&gt;} Sales\_Stream2)

在上述表达式中，内部集合表达式 Sum ({&lt;Status={'Confirmed'}&gt;} Sales\_Stream1) 和 Sum ({&lt;UpdatedStatus={'Confirmed'}&gt;} Sales\_Stream2) 不包含集合标识符。因此，在评估结果时，外部集合表达式 {&lt;Year={2023}&gt;} 和两个内部集合表达式都被应用。

#### 元素集分配

元素集指定决定了如何合并两个选择。如果使用法线等号，则内部集合表达式中的选择具有优先权。否则，将使用隐式集合运算符。

* {&lt;Field={value}&gt;} - 此内部选择将替换 “Field” 中的任何外部选择。

* {&lt;Field+={value}&gt;} - 使用并集运算符，此内部选择与 “Field” 中的外部选择合并。

* {&lt;Field\*={value}&gt;} - 使用交叉运算符，此内部选择与 “Field” 中的外部选择合并。

#### 多步骤继承

继承可以分多个步骤进行。示例：

* 当前选择项 → Sum(Amount)

  聚合函数将使用上下文，这是当前选择。

* 当前选择项 → {&lt;Set1&gt;} Sum(Amount)

  Set1 将从当前选择继承，结果将是聚合函数的上下文。

* 当前选择项 → {&lt;Set1&gt;} ({&lt;Set2&gt;} Sum(Amount))

  Set2 将从 Set1 继承，其将从当前选择继承，结果将是聚合函数的上下文。

#### Aggr() 函数

Aggr() 函数创建一个具有两个独立聚合的嵌套聚合。在下面的示例中，为 Dim 的每个值计算 Count()，并使用 Sum() 函数聚合得到的数组。

示例：

```
Sum(Aggr(Count(X),Dim))
```

Count() 是内部聚合，Sum() 是外部聚合。

* 内部聚合未从外部聚合继承任何上下文。

* 内部聚合从 Aggr() 函数继承上下文，该函数可能包含集合表达式。

* Aggr() 函数和外部聚合函数都从外部集表达式继承上下文。

## 了解详情

* [内部和外部集合表达式](https://help.qlik.com/zh-CN/sense/May2025/Subsystems/Hub/Content/Sense_Hub/ChartFunctions/SetAnalysis/set-expressions-inner-and-outer.htm#)

* [货币符号扩展](https://help.qlik.com/zh-CN/sense/May2025/Subsystems/Hub/Content/Sense_Hub/Scripting/dollar-sign-expansions.htm)

* [创建变量](https://help.qlik.com/zh-CN/sense/May2025/Subsystems/Hub/Content/Sense_Hub/Variables/create-variable-using-dialog.htm)

* [变量对话框](https://help.qlik.com/zh-CN/sense/May2025/Subsystems/Hub/Content/Sense_Hub/Sheets/variables-dialog.htm)

* [外集表达式和货币符号扩展](https://help.qlik.com/zh-CN/sense/May2025/Subsystems/Hub/Content/Sense_Hub/ChartFunctions/SetAnalysis/outer-set-expression-dollar-sign-expansion.htm)