时间计算+测量计算结合给出错误答案(SSAS)

时间:2014-03-17 10:33:13

标签: ssas mdx olap bids ssas-2008-r2

(使用SSAS 2008r2,在Bids中工作)

关于计算出的时间段成员与计算出的半加性度量之间的相互作用,我遇到了一个令人困惑的问题。

我有一个"时间段"根据文章的界限构建的尺寸"一种不同的时间计算方法"允许用户过滤措施到"上周","上个月"等。

这些计算成员的代码如下所示:

Scope([Time Period].[LW]);
    This = (ParallelPeriod([Time].[Date Hierarchy].[Week], 
                           1, 
                           [Time].[Date Hierarchy].currentmember)
                           , [Time Period].[Current]);
End Scope;

(显然月份和年份对于parallelPeriod有不同的第一个参数:))

对于我所拥有的几乎所有措施,这些工作都很好,其中大部分只是表值等的总和,除了库存指标。

我们将库存数据存储为移动值(2输入,1输出,5输入等),并且任何时间点的总库存水平是迄今为止的总和。这些是通过以下计算实现的:

Create Member CurrentCube.[Measures].[Stock Quantity] as 
sum
    (
    null:tail(descendants([Time].[Date Hierarchy].CurrentMember, 
                          [Time].[Date Hierarchy].[Date])).item(0) 
    , [Measures].[Stock Movement Quantity]
    )

现在问题。时间按照4-4-5周的月份模式设定,每4年53周。

使用"上周"从时间段维度,计算按预期工作,完全没有问题。

使用"上个月"它看起来像是迄今为止的总和"计算缺少第5周的库存移动值(即它给出了第1周,第2周,第3周,第4周至今的库存变动总和,并排除了第5​​周的所有库存变动)。使用"去年"它正在做同样的事情,但仅排除第53周的库存变动值(包括使用&#34时的第5周库存变动;去年和#34;)。但是,如果我在查询中使用以下成员:

member [Measures].[Test] as
sum
(
null:tail(descendants(parallelperiod([Time].[Date Hierarchy].[Month], 
                                    1, 
                                    [Time].[Date Hierarchy].CurrentMember),
                      [Time].[Date Hierarchy].[Date])).item(0) 
, [Measures].[Stock Movement Quantity])

它正常工作。因此看起来问题是[时间段]。[LW]或[时间段]。[LY]维度成员与迄今为止的总和[度量]。[库存数量]计算......

所以我想我知道问题出在哪里,之前有人看过这个问题,或者可以就如何修复它提出一些建议? (如果可能的话,为什么?需要它才能工作但是我很想知道我在哪里出错!!)

1 个答案:

答案 0 :(得分:0)

ParallelPeriod只有在同一级别的堂兄弟数量相同时才有效。它的工作原理如下:从当前成员上升到目标级别,每次都记住成员在其父级子项中的位置。然后返回这么多成员作为第二个参数说明,然后下降到开始级别,每次考虑子位置。因此,在四个月的月份里,它将引导你从第四周到第四周,并且不能引导你到第五周。

在你的情况下,每个级别的孩子数量可以相差一个,可能是一个逻辑某种方式如何"如果当前成员是其父级的最后一个孩子,则使用该时期的最后一个孩子,否则使用ParallelPeriod"会更合适,我。即类似的东西:

Scope([Time Period].[LW]);
    This = (IIf([Time].[Date Hierarchy].CurrentMember IS [Time].[Date Hierarchy].CurrentMember.Parent.LastChild,
               // assuming [Time].[Date Hierarchy].currentmember is a child of a member on the week level
               [Time].[Date Hierarchy].CurrentMember.Parent.PrevMember.LastChild
              ,ParallelPeriod([Time].[Date Hierarchy].[Week], 
                               1, 
                               [Time].[Date Hierarchy].currentmember)
               )
               , [Time Period].[Current]);
End Scope;

我没有测试上面的代码,可能需要进行一些调整以获得错误证明,但你应该明白这一点。