Mdx-标志-实际

Mdx-标志-实际,mdx,olap-cube,Mdx,Olap Cube,我有两个维度DimFlag和DimPNL和一个事实表FactAmount。我希望: When pnl is stat(Is Stat=1) : sum (Actual x FlagId) 对于pnlI,基本上是将金额乘以字段FlagId,如果是这样0 X=0 DimFlag FlagId FlagLabel ----------------- 1 NotClosed 0 IsClosed DimPNL PNLId PNLName Is Stat 1

我有两个维度
DimFlag
DimPNL
和一个事实表
FactAmount
。我希望:

When pnl is stat(Is Stat=1) : sum (Actual x FlagId)
对于
pnl
I,基本上是将金额乘以字段
FlagId
,如果是这样
0 X=0

DimFlag

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

PNLId  PNLName  Is Stat
1       a        1
2       test     1
3       test2    0
  id    PNLId     FlagId  Actual
  1      1        1        100
  2      2        1        10
  3      3        0        120
FactAmount

PNLId  PNLName  Is Stat
1       a        1
2       test     1
3       test2    0
  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)
);

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

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

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

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


作为一项规则,在任何聚合之前在事实表的记录级别上进行的计算应该在数据加载时进行,即。E如上所述。

在我的情况下,我该怎么做?我没有很好地理解解决方案。@user3665487我添加了详细的过程描述。