# 集合分析和集合表达式

集合分析提供了一种用于定义不同于当前选择项所定义的正规集合的数据值集合（或组）的方法。

通常，在选择选择项时，聚合函数（如 Sum、Max、Min、Avg 和 Count）会聚合所选择的选择项：当前选择项。您的选择项会自动定义要聚合的数据集。使用集合分析，您可以定义独立于当前选择项的组。如果您要显示特定值（如产品在所有区域的市场份额），而不考虑当前选择项，则集合分析非常有用。

此外，在进行不同类型的比较时（如将销量最好的产品与销量欠佳的产品进行比较，或将今年销量与去年销量进行比较），同样集合分析也非常有用。

我们假设，如在列表框中通过选择 2010 年开始在文档中工作。然后，根据该选择项进行聚合，并且图表只显示该年度的值。当您选择新选择项时，也会相应地更新图表。可以根据通过当前选择项所定义的可能记录集合来执行聚合。使用集合分析，您可以不需要根据选择项定义您所感兴趣的集合。

## 创建集合表达式

在查看集合分析示例的不同部分之前，应区分集合表达式和集合分析：

定义字段值集合称为定义集合表达式，而使用集合表达式分析数据称为集合分析。因此，本节的其余部分将会侧重于设置表达式及其分量。

此处为集合分析示例：`sum( {$<Year={2009}>} Sales )`，在其中 `{$<Year={2009}>}` 为集合表达式。

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

示例： 内部集合表达式

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

示例： 外部集合表达式

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

有关内部和外部集合表达式的详细信息，请参见[内外部集合表达式](https://help.qlik.com/zh-CN/qlikview/September2025/Subsystems/Client/Content/QV_QlikView/ChartFunctions/SetAnalysis/set-expressions-inner-and-outer.htm)。

集合表达式包含以下部分的组合：

* 标识符。一个或多个用于定义集合表达式和要在表达式其余部分中评估的内容之间的关系的标识符。简单的集合表达式包含一个单一的标识符（如美元符号 `{$}`），这意味着当前选择项中的所有记录。

* 运算符。例如，如果拥有多个标识符，可以使用一个或多个运算符优化数据集，该数据集通过组合标识符表示数据集的方式指定，以创建子集或超集。

* 修饰符。可以将一个或多个修饰符添加到集合表达式以更改选择项。修饰符可以单独使用或用于修改标识符以过滤数据集。

* 空集合保留标志。高级元素，可用于任何外集合表达式，但外集合表达式链中的最后一个除外。该标记会覆盖外集合表达式中定义的任何集合的隐式集合清除，从而简化高级表达式的配置。

  语法：`&`

  请参阅： [空集合保留标志](https://help.qlik.com/zh-CN/qlikview/September2025/Subsystems/Client/Content/QV_QlikView/ChartFunctions/SetAnalysis/empty-set-preserve-flag.htm)

信息注释集合表达式只能用于图表的表达式，而不能用于脚本表达式。

在下面的小节中已经详细地说明了标识符、运算符和修饰符。

### 标识符

标识符用于定义集合表达式和要评估的字段值或表达式之间的关系。

在 `sum( {$<Year={2009}>} Sales )` 示例中，标识符为美元符号 $，表示要评估的记录集，包含当前选择项的所有记录。然后，通过集合表达式的修饰符部分对此集合进行进一步筛选。在更复杂的集合表达式中，可以使用运算符来组合使用两个修饰符。

$ 集合标识符与不声明集合标识符相同。例如，在上面的例子中，表达式 `Sum( {$<Year = {2009}>} Sales )` 等价于 `Sum( {<Year = {2009}>} Sales )`。

下表显示了一些常用的修饰符。

共用标识符

| 标识符 | 说明 |
| --- | --- |
| `1` | 表示应用程序中所有记录的完整集合，而不考虑选择的任何选择项。 |
| `$`（或无集合标识符） | 表示当前选择项的记录。因此，集合表达式 `{$}` 与不陈述集合表达式的意义等同。 |
| `$1` | 表示上一个选择项。`$2` 表示上一个选择项，但只表示一个，以此类推。 |
| $\_1 | 表示下一个（前进）选择项。`$_2` 表示下一个选择项，但只表示一个，以此类推。 |
| `BM01` | 您可以使用任何书签 ID 或书签名称。 |
| ` MyAltState  ` | 您可以使用状态名称引用处于备用状态的这些选择项。 |

示例：

示例和结果

| 示例 | 结果 |
| --- | --- |
| `sum ({1} Sales)` | 返回文档的总销售额，忽略选择项而不是维度。 |
| `sum ({$} Sales)` | 返回当前选择项的销售额，也就是说效果与 sum(Sales) 相同。 |
| `sum ({$1} Sales)` | 返回上一个选择项的销售额。 |
| `sum ({BM01} Sales)` | 返回书签名为 BM01 的销售额。 |

### 运算符

运算符用于包括、排除或相交部分或整个数据集。所有运算符都将集合用作操作数，并返回集合作为结果。

下表显示了可用于集合表达式的运算符。

集合运算符

| 运算符 | 说明 |
| --- | --- |
| `+` | 并集运算符。此二元运算返回两个集合操作数中所有记录构成的集合。 |
| `-` | 异或运算符。此二元运算返回由属于第一个集合操作数但不属于另一个集合操作数的记录构成的集合。如用于一元运算，则结果是补集。 |
| `*` | 交集运算符。此二元运算返回两个集合操作数共有记录构成的集合。 |
| `/` | 对称差集 (XOR) 运算符。此二元运算返回包含于两个集合操作数中但不为它们所共有的记录构成的集合。 |

示例：

示例和结果

| 示例 | 结果 |
| --- | --- |
| `sum( {1-$} Sales )` | 用于返回除选择项以外的所有销售额。 |
| `sum( {$*BM01} Sales )` | 用于返回选择项和书签 BM01 之间交集的销售额。 |
| `sum( {-($+BM01)} Sales )` | 用于返回除选择项和书签 BM01 以外的销售额 |
| `Sum({$<Year={2009}>+1<Country={'Sweden'}>} Sales)` | 返回与当前选择项相关联的 2009 年的销售额，并添加所有年度中与国家 Sweden 相关联的完整数据集。<br><br>该表达式使用下面的集合标识符：`$`。因此它等同于这个表达式，后者没有说明集合标识符：`Sum({<Year={2009}>+1<Country={'Sweden'}>} Sales)`。 |

### 修饰符

修饰符可用于添加或更改选择项。此类修改可写入集合表达式。修饰符包含一个或多个字段名称，每个修饰符后面均跟着在字段中选择的一个或多个选择项。修饰符以尖括号 &lt;&gt; 为开始和结束。

集合修饰符可修改先前集合标识符的选择项。如果未引用集合标识符，则默认为当前选择项状态。

示例：

示例和结果

| MyField | 结果 |
| --- | --- |
| `sum({$<OrderDate = DeliveryDate>} Sales)` | 返回当前选择项的销售额，其中 OrderDate = DeliveryDate。<br><br>该表达式使用下面的集合标识符：`$`。因此它等同于这个表达式，后者没有说明集合标识符：`sum({<OrderDate = DeliveryDate>} Sales)`。 |
| `sum({1<Region = {US}>} Sales)` | 返回美国地区的销售额，忽略当前选择项 |
| `sum({$<Region = >} Sales)` | 返回选择项的销售额，但移除 Region 中的选择项。<br><br>该表达式使用下面的集合标识符：`$`。因此它等同于这个表达式，后者没有说明集合标识符：`sum({<Region = >} Sales)`。 |
| `sum({<Region = >} Sales)` | 返回与上述示例相同的销售额。当省略要修改的集合标识符时，则假定为继承状态。 |
| `sum({$<Year={2000}, Region={"U*"}>} Sales)` | 返回当前选择项的销售额，但 Year 和 Region 中均有新选择项。<br><br>该表达式使用下面的集合标识符：`$`。因此它等同于这个表达式，后者没有说明集合标识符：`sum({<Year={2000}, Region={"U*"}>} Sales)`。 |

请参阅 [设置修饰符](https://help.qlik.com/zh-CN/qlikview/September2025/Subsystems/Client/Content/QV_QlikView/ChartFunctions/SetAnalysis/set-modifiers.htm)，查看修饰符以及如何在更复杂的集合分析中使用修饰符的更详细描述。