我可以对自定义成员使用延迟功能吗?

时间:2013-11-27 11:38:09

标签: mdx

在下面我成功找到了与该月相关的最后一个完整月份和可计费收入。然后我想在前一个月找到目标并找到该月的收入。认为Lag将是一个很好的功能,但这似乎不起作用。没有错误,只有第二列[Measures].[PrevMth_BillInc]没有返回数据:

WITH 
MEMBER [Date].[Date - Calendar Month].[LastMth] AS
    IIF(
       Day(Now()) = 1,
       TAIL([Date].[Date - Calendar Month].[Calendar Month],2).Item(1),
       TAIL([Date].[Date - Calendar Month].[Calendar Month],2).Item(0)
       )
MEMBER [Measures].[LastMth_BillInc] AS
    SUM(
       [Date].[Date - Calendar Month].[LastMth],
       [Measures].[BillableIncome]
       )
MEMBER [Measures].[PrevMth_BillInc] AS
    SUM(
       [Date].[LastMth].Lag(1),
       [Measures].[BillableIncome]
       )
SELECT
    NON EMPTY 
        {
        [Measures].[LastMth_BillInc],
        [Measures].[PrevMth_BillInc] //<<<<<this returns nothing
        } 
    ON COLUMNS,
    NON EMPTY 
        ORDER( 
            [Customer_Dim].[Customer_Hier].[Customer_Level].Members,
            [Date].[Date - Calendar Month].[LastMth],
            BDESC
            ) 
    ON ROWS 
FROM [ourCube]

1 个答案:

答案 0 :(得分:1)

通过将[LastMth]定义为计算成员,您可以定义[Date].[Date - Calendar Month]的新成员,而不是现有成员的别名。因此Lag不起作用,因为它应用于新成员 - 它位于层次结构中与原始成员并排的位置。由于Lag是一个对层次结构进行操作的函数,因此它不是定义中使用的原始成员。

你可以通过将LastMth定义为一个包含原始的非计算成员(确切地说,它将包含一个包含原始成员的元组)的集合来解决这个问题,如下所示:

WITH
SET [LastTwo] AS
    TAIL([Date].[Date - Calendar Month].[Calendar Month],2)
SET [LastMonth] AS
    IIF(
       Day(Now()) = 1,
       Subset([LastTwo], 1, 1),
       Subset([LastTwo], 0, 1)
       )
MEMBER [Measures].[LastMth_BillInc] AS
       (
       [LastMth].Item(0).Item(0),
       [Measures].[BillableIncome]
       )
MEMBER [Measures].[PrevMth_BillInc] AS
       (
       [LastMth].ITEM(0).Item(0).Lag(2),
       [Measures].[BillableIncome]
       )
SELECT
    NON EMPTY 
        {
        [Measures].[LastMth_BillInc],
        [Measures].[PrevMth_BillInc]
        } 
    ON COLUMNS,
    NON EMPTY 
        ORDER( 
            [Customer_Dim].[Customer_Hier].[Customer_Level].Members,
            [Date].[Date - Calendar Month].[LastMth],
            BDESC
            ) 
    ON ROWS 
FROM [ourCube]

我认为你不需要sum,你可以像我上面那样使用元组,因为只有一个成员而不是一组要汇总的几个。