慢MDX自定义不同计数公式

时间:2015-01-15 23:05:52

标签: ssas mdx

我有一个问题与使用MDX创建(更有效)自定义Distinct Count Measure有关。

背景

我的多维数据集在Facts和Dimensions之间有多个很长的多对多关系链,对我来说,能够跟踪某些维度中哪些成员与其他维度相关并且与其他维度无关是很重要的。因此,我在每个维度表中创建了“不相关”记录,并将这些记录的ID值设置为-1。然后在我的中间映射事实表中,我使用-1 ID连接到这些“不相关”记录。

当我尝试在存在-1成员的任何字段上运行正常的开箱即用的不同计数时,会出现问题。如果存在-1成员,则非重复计数度量将返回比真实答案多1的结果。

为了解决这个问题,我编写了以下MDX:

CREATE MEMBER CURRENTCUBE.[Measures].[Provider DCount]
 AS

//Oddly enough MDX seems to require that the PID (Provider ID) field be different from both the     linking field and the user sliceable field.

SUM( [Providers].[PID Used For MDX].Children , 
//Don't count the 'No Related Record' item. 

IIF( NOT([Providers].[PID Used For MDX].CURRENTMEMBER IS [Providers].[PID Used For MDX].&[-1]) 
   //For some reason this seems to be necessary to calculate the Unknown Member correctly.
   //The "Regular Provider DCount Measure" below is the out-of-the-box, non-MDX measure built off the same field, and is not shown in the final output.

   AND [Measures].[Regular Provider DCount Measure] > 0 , 1 , NULL )  
), 
VISIBLE = 1 ,  DISPLAY_FOLDER = 'Distinct Count Measures' ;

问题

此MDX可以正常显示正确的答案(是的!),但是当用户开始使用超过几百个使用此度量的单元格的数据透视表时,它会非常慢。对于少于100个细胞,结果几乎是瞬间完成的。对于几千个细胞(这根本不常见),结果可能需要一个小时才能解决(uggghhh!)。

任何人都可以帮我告诉我如何编写更高效的MDX公式来完成这项任务吗?非常感谢您的帮助!!

Jon Oakdale

jonoakdale@hotmail.com

乔恩

1 个答案:

答案 0 :(得分:1)

您可以使用预定义范围来取消所有不必要的(-1)成员,而不是创建您的度量。

SCOPE ([Providers].[PID Used For MDX].&[-1]
      ,[Measures].[Regular Provider DCount Measure]);
THIS = NULL;
END SCOPE;

CREATE MEMBER CURRENTCUBE.[Measures].[Provider DCount]
 AS
SUM([Providers].[PID Used For MDX].Children
   ,[Measures].[Regular Provider DCount Measure]), 
VISIBLE = 1;

顺便说一下,我在我的测试[Providers].[PID Used For MDX].[All].Children构建中使用了,因为我不知道,你的案例中的维度/层次/ ALL级别是什么。似乎[PID Used For MDX]是ALL级别,[Providers]是维度和层次结构的名称, HierarchyUniqueName 设置为隐藏