# 內部和外部集合運算式

集合運算式可用於彙總函數內部和外部，並以大括弧括住。

使用彙總函數內部的集合運算式時，看起來會是如此：

範例： 內部集合運算式

```
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，這依次繼承自目前選項，結果將會是彙總函數的內容。

#### 內部和外部集合運算式鏈結繼承

在複雜的鏈結中使用多個集合運算式時，繼承也需要考慮其他因素，尤其是若外部集合運算式後面跟著其他外部集合運算式和/或內部集合運算式。如需詳細資訊，請參閱 [多個外部和內部集合運算式的鏈結](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/ChartFunctions/SetAnalysis/set-expressions-inner-and-outer.htm#Chains)。

#### Aggr() 函數

Aggr() 函數建立具有兩個獨立彙總的巢狀彙總。在以下範例中，會為 Dim 的每個值計算 Count()，並使用 Sum() 函數彙總產生的陣列。

範例：

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

Count() 是內部彙總，而 Sum() 是外部彙總。

* 內部彙總沒有從外部彙總繼承任何內容。

* 內部彙總從 Aggr() 函數繼承內容，這可能包含集合運算式。

* Aggr() 函數和外部彙總函數都從外部集合運算式繼承內容。

## 多個外部和內部集合運算式的鏈結

請注意，可能有多個外部集合運算式。在此範例中，我們有兩個外部集合運算式和一個內部集合運算式：

{&lt;Year={2021}&gt;} {&lt;Region={"Europe"}&gt;} Sum( {$&lt;Product={"XI345"}&gt;} Sales )

將由左至右套用集合運算式。這表示，如果兩個集合運算式使用衝突的集合，則以最右側的運算式為優先。

雖然以這種方式鏈結在一起的外部集合運算式沒有數量限制，但內部集合運算式的數量限制為一個。擁有多個相鄰的內部集合運算式不會產生任何錯誤，但在評估時只會使用其中最右側的運算式。

### 集合運算式繼承

若彙總運算式包含多個集合運算式作為鏈結的一部分，則集合運算式將由左至右逐個進行評估。每個集合運算式的結果都是一組集合，可能每個維度一個集合。這些集合會傳遞到下一個集合運算式，該運算式可以在傳遞到下一個集合運算式之前進行進一步的變更。

只要每個集合運算式在不同的維度上操作，這些運算式之間就不會發生衝突，而且所有集合都將保留到鏈結的末尾 (並在彙總期間套用)。此規則有一個例外情況，當集合運算式中的維度產生了空集合時，有時適用此例外情況。如需更多資訊，請參閱以下內容：

* [空的選項集合](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/ChartFunctions/SetAnalysis/set-expressions-inner-and-outer.htm#Empty)

* [隱含選取集合清除](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/ChartFunctions/SetAnalysis/set-expressions-inner-and-outer.htm#Implicit)

### 空的選項集合

若評估集合運算式中的維度，集合可能不包含任何資料。這稱為空集合。空集合可能出現在許多情境中，例如：

* 運算式定義不正確。例如，若嘗試使用集合運算式 {&lt;OrderYear={‘2025’}&gt;} 尋找值 2025，則此運算式寫為 {&lt;OrderYear={‘0025’}&gt;}。

* 在分析期間，在與運算式中參考的維度不同的維度中進行選取，且此選項會導致集合運算式維度沒有可用資料。例如，使用者對 Region='Europe' 進行選取，並為 {&lt;ProductCategory={‘Shirts’}&gt;} Sum (Sales) 設定集合運算式篩選條件。如果歐洲沒有銷售襯衫，則集合運算式包含空集合。

* 空集合在運算式中明確定義。這並不常見也不實用，但從技術上而言是可行的。例如︰ {&lt;Year={}&gt;}

### 隱含選取集合清除

如果套用集合運算式後的結果為任一維度的空集合 (請參閱 [空的選項集合](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/ChartFunctions/SetAnalysis/set-expressions-inner-and-outer.htm#Empty))，並且在此之後又套用了一個集合運算式，則在套用下一個集合運算式之前，將清除該維度的選項集合 (還原為完整集合)。清除選項集合表示會納入所有值。但請注意，只有在產生空集合的集合運算式之後又額外套用了一個或多個外部集合運算式時，才會發生這種清除情況。

以下是會發生清除選項集合的範例：

```
{<Year={}>} {<Region={"Europe"}>} Sum( Sales )
```

Year={} 將為維度 Year 建立空集合。這表示，當集合傳遞到包含 Region={Europe} 的下一個集合運算式時，就會清除 Year 的選項集合。請注意，選項清除僅發生在單一維度上。仍會傳遞其他維度中的集合 (包括相同集合運算式內的集合)，且不加修改。

以下是清除選項集合的另一個範例：

```
{<Year={}, Product={"XI345"}>} {<Region={"Europe"}>} Sum(Sales)
```

在上面的範例中，發生了以下情況：

* 套用了選項集合 Product={"XI345"} 和 Region={"Europe"}。

* 不會套用 Year={}。這是因為在套用最後一個集合運算式 {&lt;Region={"Europe"}&gt;} 時，已清除該集合。

將集合運算式元件移動到最後一個外部集合運算式，將可防止發生隱含清除。以此為例：

```
{<Product={"XI345"}>} {<Year={}, Region={"Europe"}>} Sum(Sales)
```

在此，我們將 Year 運算式移至鏈結中的最後一個集合運算式中。這將防止發生隱含清除，而且 Year 維度的空集合實際上將用於 Sum 彙總。

無論如何，若清除了選項集合，就可能會發生不必要的行為。為了改善分析體驗並讓撰寫集合運算式鏈結變得更容易，請使用空集合保留旗標。如需詳細資訊，請參閱[空集合保留旗標 (外部集合運算式)](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/ChartFunctions/SetAnalysis/set-expressions-inner-and-outer.htm#Flag)。

## 空集合保留旗標 (外部集合運算式)

使用 & 符號 (空集合保留旗標) 以簡化外部集合表達式的評估模型。例如︰

```
{& <Year={}, Product={XI345}>} {<Region={Europe}>} Sum( Sales )
```

在此範例中，Year={} 為 Year 定義了空的選項。如果沒有 & 符號，{&lt;Region={Europe}&gt;} 運算式將造成清除 Year 空選項集合，進而導致所有資料都用於彙總計算。& 符號強制彙總採用 Year 空選項集合，進而產生更易於理解的輸出。

如需關於空集合保留旗標的完整詳細資訊，請參閱[空集保留旗標](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/ChartFunctions/SetAnalysis/empty-set-preserve-flag.htm)。

## 瞭解更多資訊

* [貨幣符號擴充](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/dollar-sign-expansions.htm)

* [建立變數](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/Variables/create-variable-using-dialog.htm)

* [變數對話方塊](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/Sheets/variables-dialog.htm)

* [外部集合運算式和貨幣符號展開](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/ChartFunctions/SetAnalysis/outer-set-expression-dollar-sign-expansion.htm)