内部和外部集合表达式
集合表达式可以在聚合函数内外使用,并用花括号括起来。
在聚合函数中使用集合表达式时,它可能如下所示:
示例: 内部集合表达式
Sum( {$<Year={2021}>} Sales )
如果表达式具有多个聚合,并且希望避免在每个聚合函数中写入相同的集合表达式,请在聚合函数外使用集合表达式。
如果使用外部集合表达式,则必须将其放置在范围的开头。
示例: 外部集合表达式
{<Year={2021}>} Sum(Sales) / Count(distinct Customer)
如果在聚合函数之外使用集合表达式,也可以将其应用于现有的主度量值。
示例: 应用于主度量值的外部集表达式
{<Year={2021}>} [Master Measure]
在聚合函数外部使用的集合表达式会影响整个表达式,除非它用括号括起来,否则括号定义范围。在下面的词法范围示例中,集合表达式仅应用于括号内的聚合。
示例: 词法定界
( {<Year={2021}>} Sum(Amount) / Count(distinct Customer) ) – Avg(CustomerSales)
规则
词法定界
除非用括号括起来,否则集合表达式会影响整个表达式。如果是,括号定义词法范围。
位置
集合表达式必须放在词法范围的开头。
上下文
上下文是与表达式相关的选择。传统上,上下文始终是当前选择的默认状态。但如果对象设置为备用状态,则上下文是当前选择的备用状态。
还可以以外部集表达式的形式定义上下文。
继承
内部集合表达式优先于外部集合表达式。如果内部集合表达式包含集合标识符,它将替换上下文。否则,将合并上下文和集合表达式。
-
{$<SetExpression>} - 覆盖外部集合表达式
-
{<SetExpression>} - 与外部集合表达式合并
元素集分配
元素集指定决定了如何合并两个选择。如果使用法线等号,则内部集合表达式中的选择具有优先权。否则,将使用隐式集合运算符。
-
{<Field={value}>} - 此内部选择将替换 “Field” 中的任何外部选择。
-
{<Field+={value}>} - 使用并集运算符,此内部选择与 “Field” 中的外部选择合并。
-
{<Field*={value}>} - 使用交叉运算符,此内部选择与 “Field” 中的外部选择合并。
多步骤继承
继承可以分多个步骤进行。示例:
-
当前选择项 → Sum(Amount)
聚合函数将使用上下文,这是当前选择。
-
当前选择项 → {<Set1>} Sum(Amount)
Set1 将从当前选择继承,结果将是聚合函数的上下文。
-
当前选择项 → {<Set1>} ({<Set2>} Sum(Amount))
Set2 将从 Set1 继承,其将从当前选择继承,结果将是聚合函数的上下文。
Aggr() 函数
Aggr() 函数创建一个具有两个独立聚合的嵌套聚合。在下面的示例中,为 Dim 的每个值计算 Count(),并使用 Sum() 函数聚合得到的数组。
示例:
Sum(Aggr(Count(X),Dim))
Count() 是内部聚合,Sum() 是外部聚合。
-
内部聚合未从外部聚合继承任何上下文。
-
内部聚合从 Aggr() 函数继承上下文,该函数可能包含集合表达式。
-
Aggr() 函数和外部聚合函数都从外部集表达式继承上下文。