基于多维属性计算的SSAS成员

时间:2014-12-11 14:28:19

标签: sql-server-2012 ssas mdx

我尝试创建一个基于2个不同属性的新计算度量。我可以直接查询数据以查看值是否存在,但是当我创建Calculated Member时,它总是返回null。

这是我到目前为止所做的:

CREATE MEMBER CURRENTCUBE.[Measures].[Absorption]
 AS sum
(

    Filter([Expense].MEMBERS, [Expense].[Amount Category] = "OS"
           AND ([Expense].[Account Number] >= 51000 
           AND [Expense].[Account Number] < 52000))
    ,

    [Measures].[Amount - Expense]
), 
VISIBLE = 1 ,  ASSOCIATED_MEASURE_GROUP = 'Expense';     

最终,我需要多次重复这种相同的模式。一种特殊的会计&#34;类型&#34; (吸收,销售和营销,行政,R&amp; D等)基于类别和一系列帐号的组合。

我尝试了几种Sum,Aggregate,Filter,IIF等组合,但没有运气,值始终为空。

但是,如果我不使用过滤器并只创建一个包含2个值的元组,它确实会给我我期望的数据,如下所示:

CREATE MEMBER CURRENTCUBE.[Measures].[Absorption]
 AS sum
(

    {( [Expense].[Amount Category].&[OS], [Expense].[Account Number].&[51400]  )}
    ,

    [Measures].[Amount - Expense]
), 
VISIBLE = 1 ,  ASSOCIATED_MEASURE_GROUP = 'Expense';  

但是,我需要指定多个帐号,而不只是一个。

2 个答案:

答案 0 :(得分:2)

通常,只有在需要根据某个度量值(例如,销售额> 10.000的所有销售订单)过滤事实表时,才应使用FILTER函数。它不打算根据维度属性过滤成员(尽管它可能有效,但性能可能会受到影响)。

如果要按一个或多个维度属性的成员进行过滤,请使用元组和集合来表示过滤:

CREATE MEMBER CURRENTCUBE.[Measures].[Absorption]
AS 
    Sum( 
       {[Expense].[Account Number].&[51000]:[Expense].[Account Number].&[52000].lag(1)} *
       [Expense].[Amount Category].&[OS],
       [Measures].[Amount - Expense]
    ), 
VISIBLE = 1 ,  ASSOCIATED_MEASURE_GROUP = 'Expense';

在这里,我使用范围运算符:来构造一个由大于或等于51000且小于52000的所有[Account Number]成员组成的集合。然后我交叉加入{{1}这个设置带有相关的*属性,以获得我想要衡量的相关成员集。

请注意,这仅适用于您的费用维度中具有帐号51000和52000的成员(请参阅注释)。

完全不同的方法是在ETL过程中执行此逻辑。例如,您可以拥有一个帐户编号范围表,该表格映射到特定会计类型(吸收,销售和营销等)。然后,您可以向Expense维度添加新属性,保存每个帐户的记帐类型,并使用动态SQL和上述映射表填充它。

答案 1 :(得分:1)

我不接近多维数据集脚本,但您不需要通过currentmember函数创建一些上下文,并返回一些值以对不等运算符进行正确评估(例如>)通过使用membervalue函数?

CREATE MEMBER CURRENTCUBE.[Measures].[Absorption]
 AS sum
(
    [Expense].[Amount Category].&[OS]
    *
    Filter(
       [Expense].[Account Number].MEMBERS,
       [Expense].[Account Number].currentmember.membervalue >= 51000 
       AND 
       [Expense].[Account Number].currentmember.membervalue < 52000
    )
    ,

    [Measures].[Amount - Expense]
), 
VISIBLE = 1 ,  ASSOCIATED_MEASURE_GROUP = 'Expense';  

修改

Dan使用了范围运算符:。请确保您的层次结构已正确排序,并且您使用此运算符的成员实际存在。如果它们不存在,那么它们将被评估为null

针对AdvWks多维数据集:

SELECT 
  {} ON 0
 ,{
      [Date].[Calendar].[Month].&[2008]&[4]
    : 
      [Date].[Calendar].[Month].&[2009]&[2]
  } ON 1
FROM [Adventure Works];

返回以下内容:

enter image description here

如果立方体中不存在左手成员,那么它将被评估为null,因此在那一侧开放结束:

SELECT 
  {} ON 0
 ,{
      [Date].[Calendar].[Month].&[2008]&[4]
    : 
      [Date].[Calendar].[Month].&[1066]&[2] //<<year 1066 obviously not in our cube
  } ON 1
FROM [Adventure Works];

返回:

enter image description here