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

Sql server 2012 基于多维属性计算的SSAS成员,sql-server-2012,ssas,mdx,Sql Server 2012,Ssas,Mdx,我正试图创建一个基于两个不同属性的新计算度量。我可以直接查询数据以查看值是否存在,但是当我创建计算成员时,它总是返回null 以下是我到目前为止的情况: CREATE MEMBER CURRENTCUBE.[Measures].[Absorption] AS sum ( Filter([Expense].MEMBERS, [Expense].[Amount Category] = "OS" AND ([Expense].[Account Number] >

我正试图创建一个基于两个不同属性的新计算度量。我可以直接查询数据以查看值是否存在,但是当我创建计算成员时,它总是返回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';     

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

我不接近多维数据集脚本,但您不需要通过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';  
返回以下内容:

如果左侧成员在多维数据集中不存在,则其计算结果为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];
返回:


通常,仅当需要根据某些度量值(例如,Sales Amount>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';
这里,我使用了range操作符:构造一个集合,由大于或等于51000且小于52000的所有[Account Number]成员组成。然后,我将*这个集合与相关的[Amount Category]属性交叉连接,以获得我想要对度量值求和的相关成员集合

请注意,这仅在您的费用维度中实际有一个帐号为51000和52000的成员时有效请参见备注


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

您有输入错误吗?一个帐号怎么可能大于51000而小于5200?@TabAlleman,是的,谢谢。帐号是一种度量吗?如果是层次结构,[Expense].[Account Number]>=51000由SSAS解释为[Expense].[Account Number].[All],[Measures].CurrentMember>=51000@我没解释清楚。我有一个叫做费用的事实表。到目前为止,我定义的唯一度量是ExpenseAmount列的总和。我将[金额类别]和[账号]视为维度属性。账号不是继承人,它只是5位数账号的列表。谢谢你的建议。我还不太了解mdx的语法。我确实尝试过你的想法,但还是一样,都是空的。谢谢你的提示@whytheqthis可能是错误的。如果该多维数据集中不存在51999,则该多维数据集中的计算结果为null,因此您的对账单将变为[Expense].[Account Number].&[51000]:null,这是非常不同的。日期维度是使用范围运算符的一个非常安全的位置,因为成员资格通常已完成…@whytheq:否,如果未找到成员,将引发错误。您正在考虑StrToMember函数,除非指定了constrained标志,否则该函数的计算结果为null。感谢您编辑您的答案。请测试您的建议,因为没有提出错误。我会补充我的答案。@whytheq证明你是对的。我可以发誓在元组/集合表达式中引用不存在的成员会导致错误,但我必须考虑其他问题。无论如何,我编辑过的答案应该清楚地表明,这只适用于您实际引用已知成员的情况。lol-我在:上周遇到了这个问题-当与日期以外的任何内容一起使用时,肯定会有潜在的危险。此外,如果用户层次结构的顺序不正确,那么它不会失败,但会返回奇怪的答案,如果您觉得慷慨,您可以调整我的答案:……p.s。不错的防守使用滞后
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];
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';