Aggr - 图表函数

Aggr() 用于返回在声明维度或维度上计算的表达式的值的阵列。例如,每个区域的每位客户的最大销售额值。Aggr 函数用于高级聚合,其中在另一个聚合函数中要将 Aggr 函数括起来,从而将 Aggr 函数的结果阵列用作其所嵌套的聚合的输入。

Syntax:  

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

Return data type:

Arguments:  

参数 说明
expr

表达式包含聚合函数。聚合函数会默认聚合选择项定义的可能记录集合。

StructuredParameter

StructuredParameter 包括维度并可选地包括排序标准,格式为:(维度(排序类型,排序))

维度是一个单一字段,并且不能为表达式。维度用于确定为其计算表达式 Aggr 的值的阵列。

如果包含排序标准,则会将对维度计算的 Aggr 函数创建的值的阵列排序。如果排序顺序会影响其中包含 Aggr 函数的表达式的结果,则这点很重要。

有关如何使用排序标准的详细信息,请参阅向结构化参数中的维度添加排序标准

SetExpression 聚合函数会默认聚合选择项定义的可能记录集合。可选记录集合可由集合分析表达式定义。
DISTINCT

如果表达式参数前面是 distinct 限定符,或者根本没有使用限定符,则维度值的每个特殊组合只生成一个返回值。这是实现聚合的常规方式 – 维度值的每个特殊组合将在图表中占用一行。

NODISTINCT

如果表达式参数前面是 nodistinct 限定符,各维度值组合可能生成多个返回值,具体取决于基础数据结构。如果只有一个维度,则 aggr 函数将返回元素数量与源数据中的行数相同的阵列。

基本聚合函数,例如 SumMinAvg,在比较 Aggr() 函数以创建可产生另一个聚合的临时阶段性结果集合(虚拟表)时返回单个数值。例如,通过在 Aggr() 语句中按客户通过合计销售额计算平均销售额值,然后计算总和结果的平均值:Avg(TOTAL Aggr(Sum(Sales),Customer))

提示: 如果想要创建多层次嵌套图表聚合,则在计算维度中使用 Aggr() 函数。

Limitations:  

Aggr() 函数中的每个维度必须是单个字段,不能是表达式(计算维度)。

在其基本形式中,参数 StructuredParameterAggr 函数语法中是单维度。表达式:Aggr(Sum(Sales, Month)) 查找每个月销售额的总计值。但是,当包含在另一个聚合函数中时,如果不使用排序标准,将存在意外的结果。这是因为某些维度可按数字或字母等排序。

StructuredParameter 参数中(位于 Aggr 函数内),您可在表达式中指定有关维度的排序标准。由此,可在 Aggr 函数生成的虚拟表格上使用排序顺序。

参数 StructuredParameter 有以下语法:

(FieldName, (Sort-type, Ordering))

可以嵌套结构化参数:

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

排序类型可为:NUMERICTEXTFREQUENCY 或 LOAD_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 查找销售额总计值,并返回值阵列:对于 Customer 值为 295、715 和 120。

实际上,我们创建了临时的值列表,而不必创建包含这些值的明确的表格或列。

这些值可用作 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)) ))

第二个度量提供每个月的年初至今销售额。