在 MDX 中,如何对子成员执行计算然后聚合这些子成员?

Posted

技术标签:

【中文标题】在 MDX 中,如何对子成员执行计算然后聚合这些子成员?【英文标题】:In MDX, how can I perform a calculation on the child members and THEN aggregate those children? 【发布时间】:2014-10-21 14:41:50 【问题描述】:

我有如下表所示的数据,其中新的预期装运量实际上是每个索赔计数的平均装运量,但我无法正确汇总(应该是 26.3 总计,而不是 0) .有谁知道如何做到这一点?

CliID | Claim Count | Expected Shipment Amount | CliId Count   Expected Shipment Amount New
All   |      5      |           61.8           |       2     |              0
159061|   (null)    |          (null)          |    (null)   |            (null)
159063|   (null)    |          (null)          |    (null)   |            (null)
166759|      2      |           34.2           |      1      |             17.1
166769|   (null)    |          (null)          |    (null)   |            (null)
223983|      3      |           27.6           |      1      |             9.2

这个pre member应该计算每个单独的CliID的平均值,如果没有Expected Shipment Amount,则返回null:

CREATE MEMBER CURRENTCUBE.[Measures].[Expected Shipment Amount Pre] AS IIf(IsLeaf([Claim].[CliID].currentmember), ([Measures].[Expected Shipment Amount]/[Measures].[Claim Count]),0), VISIBLE = 0;

然后这是应该可见的,以便正确聚合所有内容:

CREATE MEMBER CURRENTCUBE.[Measures].[Expected Shipment Amount New] AS SUM([Measures].[Expected Shipment Amount Pre]), VISIBLE=1;

很明显,在聚合级别,它正在查看 Expected Shipment Amount Pre 并返回 0,因为聚合本身不是叶子,但对于聚合,我希望它计算所有子节点,然后添加他们起来。我怎样才能做到这一点?

【问题讨论】:

您是否尝试过让[Expected Shipment Amount Pre] 可见,然后查询多维数据集? 是的,但这说明了什么?在聚合级别 (All) 中,它显示为零为[Expected Shipment Amount Pre],这是因为我们不在那儿。如果有意义的话,我希望它能够在我们不在一片叶子时总结孩子们。 好的 - 我开始理解你的要求了 - 26.3 绝对正确为 61.8 / 5 <> 26.3 是的,因为9.2 + 17.1 = 26.3 我对所有MDX 标记的问题感兴趣。抱歉,我帮不上忙。 【参考方案1】:

在您的第二步中,您应该使用

CREATE MEMBER CURRENTCUBE.[Measures].[Expected Shipment Amount New]
 AS SUM(EXISTING [Claim].[CliID].[CliID].Members, [Measures].[Expected Shipment Amount Pre]),
VISIBLE=1;

我。 e.对CliID 级别的成员的成员求和。

编辑 您可以尝试加快速度的方法是更多地依赖内置的 Analysis Services 聚合。为此,请根据事实表中的Expected Shipment Amount 列创建一个物理度量 Expected Shipment Amount New,并将其聚合函数设置为“sum”。然后,在计算脚本中,添加

SCOPE([Claim].[CliID].[CliID].Members);
    [Measures].[Expected Shipment Amount New] = [Measures].[Expected Shipment Amount] / [Measures].[Claim Count];
END SCOPE;

这将用平均计算覆盖叶级别的“新预期装运量”的计算,但不会说明CliID 属性层次结构的All 级别的任何内容。因此,对于这个级别,应该发生指定的度量聚合,即sum

【讨论】:

酷。不过,这似乎大大减慢了查询速度。这是可以预期的/无论如何可以加快这一进程? @Travis EXISTING 可能会导致严重减速。您可以在第一个语句中去掉IIf,因为第二个语句会注意如果您使用该度量,您始终处于叶级,并且没有用户可以使用该度量,因为它是不可见的。因此,计算可能会变得更简单,从而更快。

以上是关于在 MDX 中,如何对子成员执行计算然后聚合这些子成员?的主要内容,如果未能解决你的问题,请参考以下文章

聚合最后一个值和聚合总和 mdx mondrian

通过过滤度量值在 MDX 中定义计算成员

SSAS 计算成员中的 MDX 查询

您如何使用 MDX 计算 MTD/YTD 平均工作日销售额?

MDX:按度量的表值过滤成员集

MDX 表达式:计算成员