Mdx - 旗帜 - 实际

时间:2014-07-05 07:51:18

标签: mdx olap-cube

我有两个维度DimFlagDimPNL以及一个事实表FactAmount。我期待:

When pnl is stat(Is Stat=1) : sum (Actual x FlagId)

对于pnl我将数量乘以字段FlagId,基本上是0 0 X = 0 ...

DimFlag

FlagId  FlagLabel
-----------------
1       NotClosed
0       IsClosed

DimPNL

PNLId  PNLName  Is Stat
1       a        1
2       test     1
3       test2    0

FactAmount

  id    PNLId     FlagId  Actual
  1      1        1        100
  2      2        1        10
  3      3        0        120

我尝试了以下MDX,但它没有用,有什么想法吗?

Scope (
        [Dim PNL].[PNL].members,[Measures].members     

);   


this = iif([Dim PNL].[PNL].CurrentMember.Properties("Is Stat") =1 
,
aggregate([Dim PNL].[PNL].currentmember,[Measures].currentmember)* iif([Dim Flag].[Flag Label].[Flag Label].currentmember = 0, 0, 1),
aggregate([Dim PNL].[PNL].currentmember,[Measures].currentmember)
);

1 个答案:

答案 0 :(得分:0)

虽然可以在MDX中完成此类计算,但MDX可能会变得复杂并且表现不佳。我建议明确地进行计算e。 G。在DSV或事实表上的视图,然后您直接在DSV中使用而不是事实表。然后,计算结果将是另一个列,您可以在该列上建立标准度量。

要在DSV中执行此操作,假设您使用关系表作为事实表的基础,向其添加命名计算,定义您喜欢的列名,并使用表达式Actual * FlagID。对于其他计算,您可能需要一个子选择,即。即表达式为Actual * case when pnlId in(1,2) then 1 else 0 end。您可以在选择列表中使用任何用作列表达式的SQL作为命名计算的表达式。

在FactAmount的视图中实现它,您可以更好地实现第二个表达式,因为您可以在视图定义中连接表DimPNL,从而在计算中使用列IsStat。然后,您将用视图替换表FactAmout,该视图具有两个额外的度量列。

在任何一种情况下,只需在多维数据集中的两个新列上定义两个度量,就完成了。

通常,在任何聚合之前在事实表中的记录级别上进行的计算应该在数据加载时完成,即。即如上所述。