MDX 年化

Annualization in MDX

简介 目前我正在对一项措施进行维护工作,该措施将另一项 (YTD) 措施年化。度量的粒度是月。年化在月份级别上工作正常,但是当我们在日期层次结构中使用 parents 时,计算不起作用。

它应该像这样工作:

MeasureAnnualized = YTDMeasure * (CurrentMonth / 12)

CurrentMonth 实现为

ClosingPeriod([Date].[DateHierarchy].[Month], [Date].[DateHierarchy]).MemberValue

在月级这工作正常:

Month       MeasureYTD  MeasureAnnualized   ClosingPeriod
july        -50        -85,71               7
august      -60        -90,00               8
september   (null)      (null)              9

但是在 DateHierarchy 的更高级别上,这不起作用。例如在季度级别:

 
Quarter     MeasureYTD  MeasureAnnualized           ClosingPeriod
3           -60         -80,00 (should be : -90,00) 9 (should be: 8)

如您所见,它选择了第 3 季度的 ClosingPeriod (=9),而这应该是最后一个 "non-empty" ClosingPeriod (=8)。年级也是如此:

Year        MeasureYTD  MeasureAnnualized           ClosingPeriod
2016        -60         -60,00 (should be : -90,00) 12 (should be: 8)

因此问题是: 我怎样才能让这个 ClosingPeriod 成为 YTD 度量不是(空)的最后一个 Period?

ClosingPeriod 的 msdn 定义中,它给出了相同逻辑的等效嵌套版本:

Tail(Descendants(Member_Expression, Level_Expression), 1)

下面跟这个类似加了NonEmpty:

WITH 
  MEMBER Measures.[LastNonEmpty] AS 
    Tail
    (
      NonEmpty
      (
        (EXISTING 
          [Date].[Calendar].[Month])
       ,[Measures].[Internet Sales Amount]
      )
     ,1
    ).Item(0).MemberValue 
SELECT 
  Measures.[LastNonEmpty] ON 0
 ,[Date].[Calendar].[Calendar Year].MEMBERS ON 1
FROM [Adventure Works];

它returns以下内容: