# 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-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/ChartFunctions/aggr.htm#Sorting)。 |
| SetExpression | 依預設，彙總函數將彙總選項所定義的一組可能記錄。集合分析運算式可定義一組替代的記錄。 |
| DISTINCT | 如果 expression 引數前面有 distinct 限定詞，或者完全不使用任何限定詞，則維度值的各個相異組合只會產生一個傳回值。這是製作彙總的一般方式；每個維度值的相異組合都會呈現在圖表中的一條線上。 |
| NODISTINCT | 如果 expression 引數前面有 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)新增排序條件至結構化參數的維度中

在其基本形式中，Aggr 函數語法中的引數 StructuredParameter 是單一維度。運算式：Aggr(Sum(Sales, Month)) 找到每個月的總銷售值。但是，如果含括在另一個彙總函數中，除非使用排序條件，否則會產生意料之外的結果。這是因為一些維度可能按數值或字母順序等排序。

在 Aggr 函數的 StructuredParameter 引數中，您可指定運算式中維度的排序條件。如此一來，您便在 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-TW/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 找到總銷售值，並傳回值的陣列：295、715 和 120，用於三個 Customer 值。

我們已有效建立各個值的臨時清單，而不必建立包含這些值的明確表格或資料行。

這些值作為 Avg() 函數的輸入使用，進而得到銷售額平均值 376.7。

如需關於運算式的詳細資訊，請參閱[在視覺化中使用運算式](https://help.qlik.com/zh-TW/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-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/inline-loads-qs.htm)。

#### 圖表運算式

在 Qlik Sense 工作表中建立具有 Customer、Product、UnitPrice 與 UnitSales 作為維度的表格視覺化。將以下運算式作為量值新增至表格：

`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 工作表中建立具有 Year 和 Month 作為維度的表格視覺化。將以下運算式作為量值新增至表格：

* `Sum(Sales)`
* `Sum(Aggr( Rangesum(Above(Sum(Sales),0,12)), (Year, (Numeric, Ascending)), (Month, (Numeric, Ascending)) ))` 在表格中以結構化 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 |

#### 解釋

此範例以時間性遞增順序顯示每年十二個月期間的彙總值，亦即 Aggr() 運算式的結構化參數 (數值，遞增) 部分。需要特定維度作為結構化參數：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-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/AggregationFunctions/basic-aggregation-functions.htm)
* [集合分析](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/ChartFunctions/SetAnalysis/set-analysis-expressions.htm)