MDX:计算的度量给出了“where”和“from select”的不同结果

时间:2016-10-07 08:56:07

标签: mdx iccube

我有2个MDX语句的问题,第一个给出了正确的结果,但第二个是预期的不同。

由于MDX是动态构建的,我宁愿使用第二个。

create calculated member [Sejours Ambulatoire] as sum([Ambu].[Ambu].[Ambu].[Ambulatoire], NbSejours)
create calculated member [Taux Ambulatoire] as IIF( [Ambu].[Ambu].current is [Ambu].[Ambu].[Non Ambulatoire], 0, divN([Sejours Ambulatoire], [Measures].[NbSejours] , 0)   ), format_string='percent'

第一个代码:

select [Measures].[Taux Ambulatoire] on 0
from [Cube]
where  {[Ambu].[Ambu].[Non Ambulatoire]} * {[Etablissement].[Lieu établissement].[All-M].&[CHU de Brest]} * { [Periode].[Periode].[All-M].&[2014] }

- 结果0,00%正确

第二代码:

SELECT
 { [Measures].[Taux Ambulatoire] }  ON 0
 FROM ( SELECT
{ [Periode].[Periode].[All-M].&[2014] } ON 0,
{ [Etablissement].[Lieu établissement].[All-M].&[CHU de Brest] } ON 1,
{ [Ambu].[Ambu].[Non Ambulatoire] } ON 2
     FROM [Cube])

- 结果120,86%不正确

有人可以解释一下这个区别吗?

2 个答案:

答案 0 :(得分:1)

不要忘记在icCube中你有一个MDX调试器,可以帮助你理解MDX语句的不同部分是如何解决的。

问题是这个表达式是如何解决的:

[Ambu].[Ambu].current

当前从子选择过滤器定义中获取值。它接受来自其他源的值:where子句,轴和计算成员中定义的元组。

两种可能的解决方案

1)将过滤器放在where子句而不是过滤器中,因此 current 将返回where子句中定义的元组。

2)要使IIF正常工作,您可以使用GetFilterInfo函数返回subselect的内容和where子句

isIn( GetFilterInfo([Ambu].[Ambu]) , [Ambu].[Ambu].[Non Ambulatoire] )

尽管如此,我还是仔细检查了我的陈述。

答案 1 :(得分:0)

我尝试了iSin(GetFilterInfo())建议。

with member [Taux Ambulatoire Test] as iif(isIn( GetFilterInfo([Ambu].[Ambu]) , [Ambu].[Ambu].[Non Ambulatoire] ), 0, divN([Sejours Ambulatoire], [Measures].[NbSejours] , 0)   ), format_string='percent'
SELECT
 { [Measures].[Taux Ambulatoire Test] }  ON 0
, [Ambu].[Ambu] on 1
 FROM ( SELECT
{ [Periode].[Periode].[All-M].&[2014] } ON 0,
{ [Etablissement].[Lieu établissement].[All-M].&[CHU de Brest] } ON 1
--,{ [Ambu].[Ambu].[Non Ambulatoire] } ON 2
     FROM [Cube])

效果更好,但在我想要获得所有[Ambu]。[Ambu]行的情况下,我仍然获得120,86%的NonAmbulatoire ......

我找到的唯一解决方案是为SejoursNonAmbulatoire创建一个度量。然后[Taux Ambulatoire]正在检查整个选择是否是NonAmbulatoire ......

create calculated member [Sejours Ambulatoire] as sum([Ambu].[Ambu].[Ambu].[Ambulatoire], NbSejours)
create calculated member [Sejours NONAmbulatoire] as sum([Ambu].[Ambu].[Ambu].[Non Ambulatoire], NbSejours)
create calculated member [Taux Ambulatoire] as IIF( [Sejours NONAmbulatoire] = [Measures].[NbSejours], 0, divN([Sejours Ambulatoire], [Measures].[NbSejours] , 0)   ), format_string='percent'