使用范围与计算成员

时间:2013-09-12 17:51:20

标签: ssas mdx cube

我的计算成员有问题。每当该成员参与计算或查询时,都需要花费大量时间来执行。我试图缩短执行时间。 我必须从成员中删除IIF条件并开始使用范围。

CREATE Member CurrentCube.[Measures].[AvgAmount]  as
IIF(ISLeaf([Customer].[ParentCustomer].currentmember),
    [Measures].[Value], 
    (SUM([CCube^Customer].[ParentCustomer].CURRENTMEMBER.CHILDREN) /
     COUNT([Customer].[ParentCustomer].CURRENTMEMBER.CHILDREN))
   ) , 
Format_String = "#.0000000;-#.0000000;0;0",
Non_Empty_Behavior = [Measures].[Amout];

我在这里创建了[ParentCustomer]客户的层次结构。我希望看到父母客户下的所有孩子的平均数量,但是当我看到没有任何孩子的孩子水平时,应该只显示[Measures]。[Amout]。

提前致谢

此致 萨姆

1 个答案:

答案 0 :(得分:0)

从你的问题来看,我认为你真的想要得到孩子的平均值,而不是所有叶级后代的平均值。后者可以按如下方式实施:

在客户维度表上创建一个新的度量值组,其中包含一个度量“客户计数”(将仅作为计数实现)或客户维度作为比单个客户更精细的粒度 - 客户数量更多钥匙或类似的东西。 然后将您的度量定义为

CREATE Member CurrentCube.[Measures].[AvgAmount]  as
    [Measures].[Value] / [Measures].[customer count], 
Format_String = "#.0000000;-#.0000000;0;0",
Non_Empty_Behavior = [Measures].[Amout];

这假设[Measures].[Value]的聚合被定义为sum或半加性聚合之一,但不是maxmin或类似的东西。

但是,我从你的问题中假设这不是你想要的。相反,你想看到每个级别的孩子的平均值。我假设[Customer].[ParentCustomer]是标准用户层次结构,而不是父子层次结构。然后,使用SCOPE在标题中建议的方法将起作用。假设您的[Customer].[ParentCustomer]层次结构中有三个级别:

  • (隐式定义的)所有级别,仅包含All成员
  • 级别A,根据维度
  • 的属性A构建
  • 级别B,即级别,并根据维度的属性B构建

然后,在关于[Measures].[Value]聚合的类似假设下,您可以按如下方式定义AvgAmount度量:

// create the measure as it is correct for level B:
CREATE Member CurrentCube.[Measures].[AvgAmount]  as
    [Measures].[Value], 
Format_String = "#.0000000;-#.0000000;0;0",
Non_Empty_Behavior = [Measures].[Amout];

// overwrite the definition for level A:
SCOPE([Customer].[ParentCustomer].[A].Members);
    [Measures].[AvgAmount] =  [Measures].[Value] / (EXISTING [Customer].[B].[B].Members).Count
END SCOPE;

// overwrite the definition for the ALl level:
SCOPE([Customer].[ParentCustomer].&[All]);
    [Measures].[AvgAmount] =  [Measures].[Value] / (EXISTING [Customer].[A].[A].Members).Count
END SCOPE;

这种方法,使用SCOPE,不适用于父子层次结构,但是你不会写你有一个,我只是假设你没有。