我了解如何使用 MDX Aggregate() 和 Sum() 函数以及它们之间的差异。
(一个有趣的问题是,在层次结构中的较高级别上定义的度量之和超过该级别的子级,将该度量乘以子级的数量 - 而聚合“正确”仅返回在较高级别定义的值)。
MSDN上记录的语法是:
Aggregate(Set_Expression [ ,Numeric_Expression ])
Run Code Online (Sandbox Code Playgroud)
我总是将它与两个参数一起使用。但是,当仅提供 set_expression 参数时,Aggregate 会做什么呢?文档(同样来自 MSDN)非常晦涩:
如果未提供数值表达式,则此函数将使用为每个度量指定的默认聚合运算符来聚合当前查询上下文中的每个度量。
我在 MDX 查询中尝试过,如下所示:
WITH MEMBER WeekSummedTotal AS
Aggregate([Days].[WeeksAndDays].CurrentMember.Children)
SELECT
{Measures.ThingoCount,Measures.WeekTotal,Measures.WeekSummedTotal} ON 0,
[Days].[WeeksAndDays].[WeekName] ON 1
FROM DateGRoupingTest
Run Code Online (Sandbox Code Playgroud)
这会做什么?聚合会聚合多维数据集的默认度量吗?或者设置Measures.Members?或者在 0 轴上指定的一组其他度量?
都不是!查询运行并返回结果,但计算度量 WeekSumTotal 显示 #Error,并出现完全无意义的错误:
聚合函数不能用于度量维度中的计算成员
现在这是事实,但完全无关紧要。不会计算查询中的任何其他度量,并且实际上多维数据集没有任何计算成员。那么 Aggregate() 在这里到底想做什么呢?此错误消息(再次,在 MDX 中!)是否完全具有误导性?
添加:下面的答案中的@whytheq 建议使用聚合创建计算度量,但在备用维度层次结构中而不是在度量维度中创建它。这有效,但前提是包含与所选“任何旧...”维度的 [All] 成员的交叉连接。在那里创建度量也使得不可能将两个(基本)度量和计算的度量放在同一轴上。如果我尝试这样做:
{Measures.ThingoCount,Measures.WeekTotal,[Ages].[Age Key].WeekSummedTotal} ON 0,
Run Code Online (Sandbox Code Playgroud)
我收到了非常无用的错误消息:
Members, tuples or sets must use the same hierarchies in the function.
Run Code Online (Sandbox Code Playgroud)
我认为,这意味着“我无法在 Measures 成员和 [Ages].[Age Key] 成员之间使用 , (UNION) 函数创建一个集合,因为它们是不同维度的成员”。
感谢您提供的信息丰富的答案,我的结论是带有单个参数的 Aggregate() 是一个棘手的野兽;我想知道为什么它的设计第二个参数是可选的?
我还注意到,尝试在“年龄”维度上创建计算成员(只有一个层次结构,只有一个属性)会给出误导性的错误消息:
The 'Ages' dimension contains more than one hierarchy, therefore
the hierarchy must be explicitly specified.
Run Code Online (Sandbox Code Playgroud)
除非我明确指定层次结构。MDX 具有巨大的潜力,但如果 MS 投入更多精力使其能够正确反馈错误,那么学习曲线就会平缓得多。
这会做什么?聚合会聚合多维数据集的默认度量吗?或者设置Measures.Members?或者在 0 轴上指定的一组其他度量?
Aggregate函数根据当前维度度量聚合集合Measures。如果一项措施在范围内,则该措施是“当前的”。如果度量不在范围内,measures则将考虑使用维度中的默认成员进行聚合。
可以通过多种方式将度量添加到范围中,例如
在轴上进行测量
with member [Customer].[Customer].abc as
aggregate([Customer].[Customer].members)
select [Customer].[Customer].abc on 0,
{[Measures].[Internet Sales Amount],[Measures].[Reseller Sales Amount]} on 1
from [Adventure Works]
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,成员abc被计算两次,每次测量一次。
使用子立方体
with member [Customer].[Customer].abc as
aggregate([Customer].[Customer].members)
select [Customer].[Customer].abc on 0
from (select {[Measures].[Internet Sales Amount] } on 0 from [Adventure Works])
Run Code Online (Sandbox Code Playgroud)
定义度量
with member [Customer].[Customer].abc as
aggregate([Customer].[Customer].members, [Measures].[Internet Sales Amount])
select [Customer].[Customer].abc on 0
from [Adventure Works]
Run Code Online (Sandbox Code Playgroud)
在Where子句中
with member [Customer].[Customer].abc as
aggregate([Customer].[Customer].members)
select [Customer].[Customer].abc on 0
from [Adventure Works]
where [Measures].[Internet Sales Amount]
Run Code Online (Sandbox Code Playgroud)
正如 Whytheq 所建议的,让成员处于其他一些维度层次结构组合中。否则,聚合函数可能会导致计算成员自引用本身。
采用 MSDN 定义的这一部分:
...该函数聚合当前查询上下文中的每个度量...
脚本上下文中的每个度量如下:
{Measures.ThingoCount,Measures.WeekTotal,Measures.WeekSummedTotal}
Run Code Online (Sandbox Code Playgroud)
现在Measures.WeekSummedTotal是度量维度中的计算成员 - 因此会出现错误。
我想像下面这样的东西可以正常工作,您可以在其中创建除?Aggregate之外的维度中的成员:Measures
WITH
MEMBER [SomeSpareDim].[SomeSpareHier].WeekSummedTotal AS
Aggregate
(
[Days].[WeeksAndDays].CurrentMember.Children * [SomeDim].[SomeHier].[All]
)
SELECT
[SomeSpareDim].[SomeSpareHier].WeekSummedTotal ON 0
,[Days].[WeeksAndDays].[WeekName] ON 1
FROM DateGRoupingTest;
Run Code Online (Sandbox Code Playgroud)
可以更改上面的内容以显示聚合非常有用:
WITH
MEMBER [Days].[WeeksAndDays].[Last3Weeks] AS
Aggregate
(
{
[Days].[WeeksAndDays].[Weekx]
,[Days].[WeeksAndDays].[Weeky]
,[Days].[WeeksAndDays].[Weekz]
}
)
SELECT
{Measures.ThingoCount,Measures.WeekTotal} ON 0
,{
//<< the following custom aggregated member will work for any measure, that is ON 0, via Aggregate
//it can be mixed up with the normal members of the same hierarchy like the following
[Days].[WeeksAndDays].[Last3Weeks]
,[Days].[WeeksAndDays].[WeekName].members
} ON 1
FROM DateGRoupingTest;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7904 次 |
| 最近记录: |