Aggr - 圖表函數

Aggr() 會傳回對所說明維度計算之運算式的值陣列。例如,每個地區,每個客戶的銷售額的最大值。Aggr 函數用於進階彙總,其中 Aggr 函數含括在另一個彙總函數中,使用 Aggr 函數的結果陣列作為其巢狀所在之彙總的輸入。

Syntax:  

Aggr({SetExpression}[DISTINCT] [NODISTINCT ] expr, StructuredParameter{, StructuredParameter})

Return data type: 雙值

Arguments:  

引數 描述
expr

運算式包含一個彙總函數。依預設,彙總函數將彙總選項所定義的一組可能記錄。

StructuredParameter

StructuredParameter 由維度和該格式中的排序條件 (選用) 組成:(Dimension(Sort-type, Ordering))

該維度是單一欄位且不能是運算式。維度用於確定 Aggr 運算式所計算的值陣列。

如果採用排序條件,則要對 Aggr 函數建立的值陣列 (為維度而計算) 進行排序。當排序順序影響含括 Aggr 函數的運算式的結果時,這一點很重要。

如需瞭解如何使用排序條件的詳情,請參見新增排序條件至結構化參數的維度中

SetExpression 依預設,彙總函數將彙總選項所定義的一組可能記錄。集合分析運算式可定義一組替代的記錄。
DISTINCT

如果 expression 引數前面有 distinct 限定詞,或者完全不使用任何限定詞,則維度值的各個相異組合只會產生一個傳回值。這是製作彙總的一般方式;每個維度值的相異組合都會呈現在圖表中的一條線上。

NODISTINCT

如果 expression 引數前面有 nodistinct 限定詞,則視基礎資料結構而定,維度值的各個組合可能會產生多個傳回值。如果只有一個維度,aggr 函數會傳回與來源資料中的列具有相同元素數的陣列。

SumMinAvg 等基本彙總函數會傳回單一數值,而 Aggr() 函數可加以比較,藉此建立一個暫存結果集 (虛擬表格),在該結果集的基礎上可進行其他彙總。例如,在 Aggr() 陳述式中按客戶加總銷售額來計算平均銷售值,然後計算加總結果的平均值:Avg(TOTAL Aggr(Sum(Sales),Customer))

提示: 若要在多個層級中建立巢狀圖表彙總,請在計算維度中使用 Aggr() 函數。

Limitations:  

Aggr() 函數中的每個維度都必須是單一欄位,且不能為運算式 (計算維度)。

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

Aggr 函數的 StructuredParameter 引數中,您可指定運算式中維度的排序條件。如此一來,您便在 Aggr 函數產生的虛擬表格中強制使用了排序順序。

引數 StructuredParameter 具有以下語法:

(FieldName, (Sort-type, Ordering))

結構化參數可構成巢狀:

(FieldName, (FieldName2, (Sort-type, Ordering)))

排序類型可以是:NUMERICTEXTFREQUENCYLOAD_ORDER

與每個排序類型關聯的順序類型如下所示:

排序類型 允許的順序類型
NUMERIC ASCENDINGDESCENDINGREVERSE
TEXT ASCENDINGA2ZDESCENDINGREVERSE Z2A
FREQUENCY DESCENDINGREVERSE ASCENDING
LOAD_ORDER ASCENDINGORIGINALDESCENDINGREVERSE

順序類型 REVERSEDESCENDING 相同。

對於排序類型 TEXT,順序類型 ASCENDINGA2Z 是相同的,而 DESCENDINGREVERSEZ2A 也是相同的。

對於排序類型 LOAD_ORDER,順序類型 ASCENDINGORIGINAL 是相同的。

Examples and results:  

範例 結果
Avg(Aggr(Sum(UnitSales*UnitPrice), Customer))

運算式 Aggr(Sum(UnitSales*UnitPrice), Customer)Customer 找到總銷售值,並傳回值的陣列:295、715 和 120,用於三個 Customer 值。

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

這些值作為 Avg() 函數的輸入使用,進而得到銷售額平均值 376.6667。(您必須在屬性面板的呈現方式下選取總計)。

Aggr(NODISTINCT Max(UnitPrice), Customer)

值陣列:16、16、16、25、25、25、19 與 19。nodistinct 限定詞表示陣列對來源資料中的每行都含有一個元素:每個元素對於各個 CustomerProduct 都是最大的 UnitPrice

範例中使用的資料:

建立具有 CustomerProductUnitPriceUnitSales 作為維度的表格。將運算式作為量值新增至表格。

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||19

] (delimiter is '|');

 

Examples and results: 結構化參數

範例 結果
Sum(Aggr( Rangesum(Above(Sum(Sales),0,12)), (Year, (Numeric, Ascending)), (Month, (Numeric, Ascending)) ))

此量值使用運算式中結構化參數引數的排序標準計算每月的年度至本日銷售量。

如果沒有排序條件,運算式 Sum(Aggr( Rangesum(Above(Sum(Sales),0,12)), (Year), (Month) )) 的結果視維度 YearMonth 的排序方式而定。我們可能得不到我們想要的結果。

透過新增排序類型的值和維度的順序類型,我們可以向結構化參數提供排序條件: (Year, (Numeric, Ascending)), (Month, (Numeric, Ascending))。排序類型 NUMERIC 和順序 ASCENDING 決定以遞增數值順序來排序 YearMonth

範例中使用的資料:

下列載入指令碼會透過訂單產線產生訂單表格,以用於結構化參數的範例。

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;

您可以在表格中或在獨立的折線圖中比較這些量值之間的差異:

  • Sum(Aggr( Rangesum(Above(Sum(Sales),0,12)), (Year), (Month) ))
  • Sum(Aggr( Rangesum(Above(Sum(Sales),0,12)), (Year, (Numeric, Ascending)), (Month, (Numeric, Ascending)) ))

第二個量值提供正確的每月年度至本日銷售量。