# 集合分析

在应用程序中进行选择时，将在数据中定义记录的子集。聚合函数，诸如 `Sum()`、`Max()`、`Min()`、`Avg()` 和 `Count()` 都基于该子集计算。

换句话说，您的选择定义了聚合的范围；它定义了进行计算的记录集。

集合分析提供了一种定义范围的方法，该范围不同于当前选择所定义的记录集。该新范围也可被视为一种替代选择。

如果要将当前选择与特定值（例如去年的值或全球市场份额）进行比较，此选项非常有用。

[Set Analysis examples](https://play.vidyard.com/xFzHJPodxxWJNV5MVizDnv)

## 集合表达式

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

示例： 内部集合表达式

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

示例： 外部集合表达式

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

有关内部和外部集合表达式的更多信息，请参阅[内部和外部集合表达式](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/ChartFunctions/SetAnalysis/set-expressions-inner-and-outer.htm)。

集合表达式包含以下元件的组合：

* 标识符。集合标识符表示在别处定义的选择。它还表示数据中的一组特定记录。它可以是当前选择、书签选择或备用状态选择。简单的集合表达式包含一个单一的标识符（如美元符号 {$}），这意味着当前选择项中的所有记录。

  示例：`$`、`1`、`BookMark1`、`State2`

  参阅： [集合标识符](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/ChartFunctions/SetAnalysis/set-identifiers.htm)

* 运算符。集合运算符可用于创建不同集合标识符之间的并集、差异或交点。通过这种方式，您可以创建由集合标识符定义的选择的子集或超集。

  示例：`+`、`-`、`*`、`/`

  参阅： [集合运算符](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/ChartFunctions/SetAnalysis/set-operators.htm)

* 修饰符。可以将集合修饰符添加到集合标识符以更改其选择。修饰符也可以单独使用，然后修改默认标识符。修饰符必须用尖括号 `<…>` 括起来。

  示例：`<Year={2020}>`、`<Supplier={ACME}>`

  参阅： [集合修饰符](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/ChartFunctions/SetAnalysis/set-modifiers.htm)

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

  语法：`&`

  参阅： [空集合保留标志](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/ChartFunctions/SetAnalysis/empty-set-preserve-flag.htm)

这些元素被组合成集合表达式。

集合表达式中的元素

集合表达式中的元素

集合表达式中的元素 ![集合表达式中的元素。](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Resources/Images/ui_gen_setanalysis_callout.png)

例如，以上集合表达式是从聚合 `Sum(Sales)` 生成的。

第一个操作数返回当前选择的年份 `2021` 的销售额，由 `$` 集合标识符和包含年份 `2021` 选择的修饰符指示。第二个操作数返回 `Sweden` 的 `Sales`，并忽略由 `1` 集合标识符指示的当前选择。

最后，表达式返回一个集合，该集合由属于两个集合操作数中任何一个的记录组成，如 `+` 集合运算符所示。

有关完整的语法描述，请参见[集合表达式语法](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/ChartFunctions/SetAnalysis/syntax-for-sets.htm)。

## 实例

以下主题中提供了组合上述集合表达式元素的示例：

* [集合修饰符和高级搜索](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/ChartFunctions/SetAnalysis/set-modifiers-advanced-searches.htm)

* [集合修饰符和货币符号扩展](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/ChartFunctions/SetAnalysis/set-modifiers-dollar-sign-expansions.htm)

* [集合修饰符和集合运算符](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/ChartFunctions/SetAnalysis/set-modifiers-set-operators.htm)

* [带隐式集合运算符的集合修饰符](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/ChartFunctions/SetAnalysis/set-modifiers-using-assignments-implicit-set-operators.htm)

* [使用集合函数的集合修饰符](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/ChartFunctions/SetAnalysis/set-modifiers-implicit-field-value-definitions.htm)

要尝试其他一些表达式，请参阅[教程 - 创建集合表达式](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/ChartFunctions/SetAnalysis/set-analysis-tutorial.htm)。

## 自然集

通常，集合表达式表示数据模型中的一组记录和定义此数据子集的选择。在这种情况下，该集合称为自然集合。

集合标识符（带或不带集合修饰符）始终表示自然集合。

然而，使用集合运算符的集合表达式也表示记录的子集，但通常仍然不能使用字段值的选择来描述。这样的表达式是非自然的集合。

例如，`{1-$}` 给定的集合不能总是由选择定义。因此，它不是一个自然的集合。这可以通过加载以下数据、将其添加到表中，然后使用筛选窗格进行选择来显示。

```
Load * Inline
[Dim1, Dim2, Number
A, X, 1
A, Y, 1
B, X, 1
B, Y, 1];		
```

通过对 Dim1 和 Dim2 进行选择，可以获得下表所示的视图。

具有自然集合和非自然集合的表

具有自然集合和非自然集合的表

具有自然集合和非自然集合的表 ![具有自然集合和非自然集合的表。](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Resources/Images/ui_gen_setanalysis_natural.png)

第一个度量中的集合表达式使用自然集合：它对应于所做的 {$} 选择 。

第二度量是不同的。它使用 {1-$}。不可能做出与此集合对应的选择，因此它是非自然集合。

这种区别有许多后果：

* 集合修饰符只能应用于集合标识符。它们不能应用于任何集合表达式。例如，不可能使用以下集合表达式：

  ```
  { (BM01 * BM02) <Field={x,y}> }
  ```

  在这里，正常（圆形）括号表示应在应用“设置”修饰符之前计算 BM01 和 BM02 之间的交点。原因是没有可以修改的元素集。

* 不能在 P() 和 E() 元素函数中使用非自然集。这些函数返回一个元素集，但无法从非自然集推断元素集。

* 如果数据模型有多个表，则使用非自然集的度量值不能始终归因于正确的维度值。例如，在下表中，一些排除在外的销售数字归因于正确的 Country，而另一些将 NULL 作为 Country。

  具有非自然集的图表

  具有非自然集的图表

  具有非自然集的图表 ![具有非自然集合的表。](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Resources/Images/ui_gen_setanalysis_non_natural.png)

  分配是否正确取决于数据模型。在这种情况下，如果号码属于被选择排除在外的国家，则无法分配该号码。

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

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

| 示例 | 结果 |
| --- | --- |
| sum({$&lt;OrderDate = DeliveryDate&gt;} Sales) | 返回当前选择项的销售额，其中 OrderDate = DeliveryDate。 |
| sum({1&lt;Region = {US}&gt;} Sales) | 返回美国地区的销售额，忽略当前选择项 |
| sum({$&lt;Region = &gt;} Sales) | 返回选择项的销售额，但移除 Region 中的选择项。 |
| sum({&lt;Region = &gt;} Sales) | 返回与上述示例相同的销售额。当省略要修改的集合时，则假定 $。 |
| sum({$&lt;Year={2000}, Region={“U\*”}&gt;} Sales) | 返回当前选择项的销售额，但 Year 和 Region 中均有新选择项。 |

相关学习内容：

* [如何使用当前选择状态配置集合表达式？](https://help.qlik.com/lnk/How_configure_set_expression_using_selection_state)

## 了解详情

* [如何使用当前选择状态配置集合表达式？](https://help.qlik.com/lnk/How_configure_set_expression_using_selection_state)