0

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

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

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

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

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 周的股票走势值(使用“去年”时,它包括第 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])

它工作正常。所以看起来问题出在 [Time Period].[LW] 或 [Time Period].[LY] 维度成员与迄今为止的总和 [Measures].[Stock Quantity] 计算相结合时......

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

4

1 回答 1

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;

我没有测试上面的代码,它可能需要一些修改才能获得错误证明,但你应该明白了。

于 2014-03-19T16:55:02.650 回答