MDX查询SUM PROD进行加权平均

时间:2013-12-05 15:55:42

标签: mdx olap bids

我正在MS BIDS中构建一个多维数据集。我需要创建一个计算度量,返回按搜索次数加权的等级值的加权平均值。我想要在任何级别计算这个值,无论应用什么维度来分解数据。

我正在尝试执行以下操作:

我有一个称为[排名搜索产品]的度量,我希望在最低级别应用,然后对其所有值求和

IIf([Measures].[Searches] IS NOT NULL, [Measures].[Rank] * [Measures].[Searches], NULL)

然后我的加权平均指标使用了这个:

IIf([Measures].[Rank Search Product] IS NOT NULL AND SUM([Measures].[Searches]) <> 0,
SUM([Measures].[Rank Search Product]) / SUM([Measures].[Searches]), 
NULL)

我是编写MDX查询的新手,所以这对我来说非常困惑。计算应

 ([Rank][0]*[Searches][0] + [Rank][1]*[Searches][1] + [Rank][2]*[Searches][2] ...)
 / SUM([searches])

我也尝试按照此链接http://sqlblog.com/blogs/mosha/archive/2005/02/13/performance-of-aggregating-data-from-lower-levels-in-mdx.aspx

中的说明进行操作

目前将我的数据加载到Excel中的数据透视表中是返回#VALUE!对于我的自定义度量的所有计算。

请停止!

1 个答案:

答案 0 :(得分:2)

首先,您需要在多维数据集中使用中间度量,例如Rank times Searches。实现此目标的最有效方法是在处理度量值组时进行计算。您可以通过列e扩展您的事实表。 G。在视图中或在数据源视图中添加命名计算。此列的SQL表达式类似于Searches * Rank。在多维数据集定义中,您可以将此度量的聚合函数设置为Sum并使其不可见。然后只需将加权平均值定义为

[Measures].[Rank times Searches] / [Measures].[Searches]

或者,为了避免对零/空搜索值产生刺激性结果:

IIf([Measures].[Searches] <> 0, [Measures].[Rank times Searches] / [Measures].[Searches], NULL)

自Analysis Services 2012 SP1起,您可以将后者缩写为

Divide([Measures].[Rank times Searches], [Measures].[Searches], NULL)

然后MDX引擎会自动在所有维度上应用所有内容。

在第二个表达式中,<> 0测试包括<> null测试,如在数字上下文中,通过MDX将NULL评估为零 - 与SQL相比。

最后,当我解释您在问题中的链接时,您可以将SQL /数据源视图级别上的度量Rank times Searches保留为任何值,可能只是0或null,然后将以下内容添加到计算脚本中:

({[Measures].[Rank times Searches]}, Leaves()) = [Measures].[Rank] * [Measures].[Searches];

从我的观点来看,这个解决方案并不像上面所描述的那样直接计算价值。我还认为它可能会更慢,至少如果您对多维数据集中的某些分区使用聚合。