MDX Aggregate()对单个参数做了什么?

时间:2015-08-19 10:36:28

标签: ssas mdx

我理解如何使用MDX Aggregate()和Sum()函数以及它们之间的差异。

(一个有趣的一点是,在一个层次结构中更高级别定义的度量的总和超过该等级的子项将度量乘以子项的数量 - 而Aggregate“正确”仅返回在更高级别定义的值)

MSDN上记录的语法是:

Aggregate(Set_Expression [ ,Numeric_Expression ])

我总是将它与两个参数一起使用。但是当只提供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

这会怎么做? Aggregate会聚合多维数据集的默认度量吗?或者设置Measures.Members?或者在0轴上指定的其他一组度量?

这些都不是!查询运行并返回结果,但计算度量WeekSumTotal显示#Error,带有完全无意义的错误:

  

汇总函数不能用于度量维度

中的计算成员

现在这是真的,但完全无关紧要。查询中没有其他度量计算,实际上多维数据集没有任何计算成员。那么Aggregate()实际上是在尝试做什么呢?此错误消息(再次,在MDX中!)完全是误导性的吗?

ADDITION:下面的答案中的@whytheq建议使用Aggregate创建计算的度量,但是在备用维层次结构而不是Measures维度中创建它。这有效,但仅当包含与所选“任何旧...”维度的[全部]成员的交叉连接时。 在那里创建测量也使得无法将两个(基础)测量和计算的测量放在同一轴上。如果我尝试这样做:

{Measures.ThingoCount,Measures.WeekTotal,[Ages].[Age Key].WeekSummedTotal} ON 0,

我收到了无用的错误消息:

Members, tuples or sets must use the same hierarchies in the  function.
我认为,

转换为“我不能使用措施成员和[年龄]成员之间的(UNION)函数来设置集合。[年龄密钥]因为它们是不同维度的成员”。

我的结论,多亏了你提供的丰富答案,是带有一个参数的Aggregate()是一个棘手的野兽;我想知道它为什么设计第二个参数是可选的?

我还注意到,尝试在我的Ages维度上创建我的计算成员(只有一个层次结构,只有一个属性)会给我一个误导性的错误信息:

The 'Ages' dimension contains more than one hierarchy, therefore
the hierarchy must be explicitly specified.

除非我明确指定层次结构。 MDX有很大的潜力,但如果MS花费更多努力使其正确反馈错误,那么学习曲线会更加温和。

2 个答案:

答案 0 :(得分:3)

  

这会怎么做? Aggregate会聚合多维数据集的默认值   衡量一下?或者设置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]

在上面的示例中,成员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])

定义中的衡量指标

with member [Customer].[Customer].abc as
aggregate([Customer].[Customer].members, [Measures].[Internet Sales Amount])


select [Customer].[Customer].abc on 0
from [Adventure Works]

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]

正如为什么theq所建议的那样,将成员放在其他维度 - 层次结构组合上。否则,聚合函数可能会导致计算成员自引用本身。

答案 1 :(得分:2)

参考MSDN定义的这一部分:

  

...此函数聚合当前查询中的每个度量   背景......

脚本上下文中的每个度量如下:

{Measures.ThingoCount,Measures.WeekTotal,Measures.WeekSummedTotal}

现在Measures.WeekSummedTotal是度量维度中的计算成员 - 因此是错误。

我想象以下内容可以正常运行,您可以使用AggregateMeasures以外的维度中创建成员吗?:

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;

以上内容可以更改为显示Aggregate非常有用:

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;