在MDX中过滤相对于CurrentMember的维度

时间:2012-11-27 20:44:05

标签: ssas mdx olap ssas-2008

我在完成一些我认为在MDX中应该相对简单的事情时遇到了一些麻烦。我想创建一个计算成员,在给定时间点提供前两周我的一项衡量标准的总和。我的时间维度如下:

TimeId    TradingDate   Day of Week
-----------------------------------
1000      11/1/2012     Thursday
1001      11/2/2012     Friday
1002      11/5/2012     Monday
1003      11/6/2012     Tuesday
...       ...

这使得特别困难的是我的时间维度并不完全。我的时间维度的成员只对应于股票市场的交易日,而不是所有时间。这意味着不包括周末,假日或股票市场关闭的任何其他日子。这也意味着遍历时间的常规方法(例如LAGPARALLELPERIOD)在这里不会正常工作。例如,LAG(14)表示“14个交易日”,在任何给定点都可以表示实际时间的可变长度。

在我的计算成员中,我正在尝试使用FILTER,以便只获得在CurrentMember的前两周内的时间成员。但是,我似乎无法弄清楚正确的语法(如果有的话)来实现这一点。我想它会是这样的:

WITH MEMBER [Sum of Price Previous 2 Weeks] AS
    SUM(
        FILTER(
            [Time].[TimeId].Children
            , [Time].[TradingDate].MemberValue 
              >= VBA!DATEADD("ww", -2, [Time].[TradingDate].CurrentMember.MemberValue)
        )
        , [Price]
    )

然而,这并不是很有效。我似乎无法将计算成员当前迭代的上下文与FILTER函数内部的单独上下文分开。换句话说,我不知道怎么说:

  

“迭代FILTER内的集合时,比较当前值   每次迭代的成员,对应于CurrentMember的值   计算成员的范围“

我正在努力实现的目标是什么?是否有一种不同的方法可以用来完成我追求的目标?

2 个答案:

答案 0 :(得分:2)

您从计算成员获得的结果将取决于查询的轴。首先,请确保您的轴上有[Time].[TradingDate]

其次,您的[Time].[TradingDate]层次结构应按密钥排序(我假设TradingDate是密钥)。

现在您可以使用此成员定义:

WITH MEMBER [Sum of Price Previous 2 Weeks] AS
    SUM(
        [Time].[TradingDate].CurrentMember.Lag(14):[Time].[TradingDate].CurrentMember, [Price]
    )

答案 1 :(得分:1)

您可以使用set aliases来引用Filter上下文中的外部CurrentMember:

WITH MEMBER [Sum of Price Previous 2 Weeks] AS
        SUM(
            GENERATE([Time].[TradingDate].CurrentMember AS CurrentDateAlias,
                     FILTER(
                          [Time].[TimeId].Children
                          , [Time].[TradingDate].MemberValue 
                          >= VBA!DATEADD("ww", -2, CurrentDateAlias.Item(0).MemberValue)
                     )
            )
            , [Price]
        )

GENERATE仅用于在别处定义别名。