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



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

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

我根据文章"时间计算的不同方法"建立了一个"时间段"维度,它允许用户将度量过滤为"上周"、"上个月"等。

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

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

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

这些对我拥有的几乎所有度量都很好,其中大多数只是表值等的总和,除了股票度量。

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

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周。

当使用来自Time Period维度的"Last Week"时,计算按预期工作,没有任何问题。

当使用"上个月"时,看起来"迄今为止的总和"计算缺少第5周的股票移动值(即它给出了第15周,第2周,第3周,第4周迄今为止的股票移动之和,并排除了第5周的所有股票移动)。当使用"去年"时,它正在做同样的事情,但只排除第53周的股票运动值(当使用"去年"时,它包括第5周的股票运动)。但是,如果我在查询中使用以下成员:

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]或[时间周期]。维度成员与迄今为止的总和[Measures]相结合。【库存数量】计算…

所以我想我知道问题在哪里,有人见过这个之前或可以给出一些建议如何解决它?(如果可能的话,为什么?需要它的工作,但我很想知道我在哪里错了!!)

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;

我没有测试上面的代码,它可能需要一些调整来获得错误证明,但是您应该了解这个想法。

最新更新