MDX iif 日期大于在我的多维数据集中无法正确评估

MDX iif date greather than doesn't evaluate correctly in my cube

我有一个问题,看起来很容易解决,但我做不到。在我的 Fact table 中,我有一个 Timestamp 字段,它是一个 smalldatetime 类型。此事实通过其 fulldate_Fk(也称为 SmallDatetime)链接到时间维度。所以我想要的是将时间戳与事实中的 FullDate_FK 进行比较,以创建这样的计算:

iif([Dim Time].[Date].CurrentMember.MemberValue <= 
    [Fact].[Timestamp].CurrentMember.MemberValue
   ,[measures].[YTD Actuals]  
   ,[measures].[YTD Actuals]+[measures].[YTD Com])

但它根本不起作用。所有 [Dim Time].[Date] 似乎都被评估为 < 比时间戳。 P.S:时间戳是数据加载到数据库中的最后日期(在我的例子中是 31/08)

这是我得到的结果:

 MONTH   |  YTD Actuals  |  YTD Com   |  Calculation;
 JAN  ,        10      ,        10   ,        10;
 FEB  ,        20      ,        10   ,        20;
 MAR  ,        40      ,        20   ,        40;
 MAY  ,        60      ,        30   ,        60;
 JUN  ,        70      ,        50   ,        70;
 JUL  ,        85      ,        50   ,        85;
 AUG  ,       120      ,        55   ,       120;
 SEP  ,       120      ,        60   ,       120;
 OCT  ,       120      ,        70   ,       120;
 NOV  ,       120      ,        80   ,       120;
 DEC  ,       120      ,        90   ,       120;

从 8 月开始,我应该在计算中包含 Actuals YTD 和 Com YTD 之和,但我仍然只有 Actuals YTD?

额外信息 我只是通过在 Excel 中拖动属性来使用数据透视表。行和度量中的月份(2 YTD 和新的计算成员)

如果您构建一个新的计算器:

[Fact].[Timestamp].CurrentMember.MemberValue

将它添加到数据透视表后,return 有什么作用?无效的?我怀疑 CurrentMember 是 All 成员,因此 MemberValue 为空。但是让我们测试一下。

事实 table 中的所有行都具有相同的时间戳还是有许多不同的时间戳?

如果您的事实 table 有 10000 行,您是否期望 IIf 计算将被计算 10000 次(每行一次)?这不是 MDX 的工作方式。在具有 12 行的数据透视表中,IIf calc 在月粒度时被评估 12 次。

如果您希望对 10000 行中的每一行都进行计算,则将计算写入 SQL 并在到达多维数据集之前在 SQL 视图中执行。

要使计算在立方体中按照您的预期进行,请考虑执行以下操作。在您的 DimTime SQL table 中添加一个名为 Today Flag 的新列。它应该在 ETL 期间更新为仅在今天的行上为 Y,而在其他行上应该为 N。然后将该列作为新属性添加到您的 Dim Time 维度。你可以让它 Visible=False。然后转到“计算”选项卡并翻转到“脚本”视图并将当前的 [Measures].[Calculation] calc 替换为:

Create Member CurrentCube.[Measures].[Calculation] as
[measures].[YTD Actuals];
Scope({Exists([Dim Time].[Month].[Month].Members,[Dim Time].[Today Flag].&[Y]).Item(0).Item(0):null});
    [Measures].[Calculation] = [measures].[YTD Actuals]+[measures].[YTD Com];
End Scope;