Ssas 对计算成员使用作用域

Ssas 对计算成员使用作用域,ssas,mdx,cube,Ssas,Mdx,Cube,我的会员有问题。每当此成员涉及计算或查询时,都需要花费大量时间来执行。我正在努力缩短执行时间。 我必须从成员中删除IIF条件,并开始使用作用域 CREATE Member CurrentCube.[Measures].[AvgAmount] as IIF(ISLeaf([Customer].[ParentCustomer].currentmember), [Measures].[Value], (SUM([CCube^Customer].[ParentCustomer].CU

我的会员有问题。每当此成员涉及计算或查询时,都需要花费大量时间来执行。我正在努力缩短执行时间。 我必须从成员中删除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]

提前谢谢

问候,,
Sam

根据你的问题,我假设你真的想要孩子的平均值,而不是所有叶级后代的平均值。后者可按以下方式实施:

// 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;
在customer维度表上创建一个新的度量值组,该度量值组具有一个度量值“customer count”,该度量值将仅作为count实现,或者作为粒度比单个customer count更细的customer维度来实现,与customer key或类似的内容不同。 然后将度量定义为

CREATE Member CurrentCube.[Measures].[AvgAmount]  as
    [Measures].[Value] / [Measures].[customer count], 
Format_String = "#.0000000;-#.0000000;0;0",
Non_Empty_Behavior = [Measures].[Amout];
这假设[Measures].[Value]的聚合定义为总和或半相加聚合之一,但不是最大值或最小值或类似值

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

隐式定义的All级别,仅包含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;
这种使用范围的方法不适用于父子层次结构,但是如果你没有写你有一个,我只是假设你没有