检索最后一个非空值并显示每天

时间:2013-09-05 06:23:14

标签: sql-server ssas mdx olap cube

我是SSAS的新用户,MDX更新,我需要您的帮助以获取以下方案。

在我的多维数据集中,有一个名为WIP Hours(Work In Progress Hours)的度量。 该度量来自称为WIP的度量组,它基于事实表,即facWIP。

facWIP表从源表中获取其数据。 每次用户将WIP条目输入到前端系统时,该条目都存储在此表中。 但是,用户并不总是每天都输入一个条目。

例如,16 Aug 2013 and the WIP value = 47有一个条目。 下一个条目位于26 Aug 2013 of WIP = 42 2013年8月17日至8月25日在源表中没有条目,因此在事实表中也是如此。

这反映在我构建的多维数据集中。 要求是如果特定日期没有条目,则需要使用/显示最后可用的数字。 所以在这种情况下,在立方体中应该有8月17日至25日的条目,WIP = 47等等。

我根本不知道如何做到这一点。 我尝试使用以下MDX

CREATE MEMBER CURRENTCUBE.[Measures].[WIP Hours_2]
AS
(TAIL(NONEMPTY(DESCENDANTS([Calendar].[Calendar].CURRENTMEMBER,[Calendar].[Calendar].[Calendar Date]), [Measures].[WIP Hours]),1).ITEM(0), [Measures].[WIP Hours]),
//NON_EMPTY_BEHAVIOR = { [Measures].[WIP Hours] }, 
VISIBLE = 1 , ASSOCIATED_MEASURE_GROUP = 'WIP' ;

但它没有做我想要的。


2013年9月8日更新:

我也在尝试另一种替代方法,即将表格与日历表交叉加入,以便每个任务WIP组合都有每天的条目。 对于实际没有实际WIP值的条目,它将是WIP = NULL。 这种方法的缺点是事实表变得更大,ETL过程更长,从1.5M到17M的记录!

我正在考虑这样做,不知何故在使用MDX的立方体计算度量中,我可以这样说: “如果当前日期的WIP为NULL,则获取/使用最后一个非NULL WIP值” 如果它有意义的话,我怎样才能在MDX中编写这个逻辑呢?

此外,目前,在多维数据集中,实际具有WIP = NULL的日期条目,其WIP显示为= 0 ..

非常感谢任何帮助。

谢谢!

1 个答案:

答案 0 :(得分:1)

我会尝试递归方法:

// intermediate measure, makes the code more readable:
CREATE MEMBER CURRENTCUBE.[Calendar].[Calendar].[last day in period] AS
       Tail(Descendants([Calendar].[Calendar].CURRENTMEMBER,
                        [Calendar].[Calendar].[Calendar Date]
            )
       ).Item(0).Item(0),
VISIBLE = 0;

// final measure, defined using recursion:
CREATE MEMBER CURRENTCUBE.[Measures].[WIP Hours_2]
AS
IIf(IsEmpty( ( [Calendar].[Calendar].[last day in period], [Measures].[WIP Hours] )),
    ( [Calendar].[Calendar].[last day in period].PrevMember, [Measures].[WIP Hours_2] ),
    ( [Calendar].[Calendar].[last day in period], [Measures].[WIP Hours] )
),
VISIBLE = 1 , ASSOCIATED_MEASURE_GROUP = 'WIP' ;

true IIf的情况是递归,第二种情况是递归的终止。 SSAS应该能够在到达Calendar层次结构的开头时立即结束递归,从而避免无限递归。

如果以上内容没有给出正确答案,那么使用<> 0代替IsEmpty可能会获得更好的结果。