OLAP Cube中如何让Scope排除指定计算度量作用于其余度量?
解决MDX SCOPE中使用EXCEPT排除计算度量的报错问题
我之前也碰到过一模一样的报错,来给你拆解下问题和解决办法:
为什么你的语句会报错?
你收到的错误提示“A set has been encountered that cannot contain calculated members”,核心原因是:[Measures].AllMembers会返回所有度量——包括模型里的存储度量,以及你已经定义好的计算度量(比如你要排除的[Measures].[Stock Unit Close])。而MDX的SCOPE语句不允许直接作用于包含计算度量的集合,尤其是当你试图在计算脚本里批量覆盖计算度量的逻辑时,会触发计算顺序冲突,导致报错。
两种可行的解决方案
方案1:只针对存储度量作用,按需补充计算度量
如果你希望时间计算逻辑只作用于存储度量,那直接用[Measures].Members就够了(这个函数只返回存储度量,本身就不包含你要排除的计算度量):
SCOPE([Measures].Members); -- 这里写你的时间计算逻辑 END SCOPE;
如果还有部分计算度量需要应用这个逻辑,就把存储度量和需要包含的计算度量合并,再排除不需要的:
SCOPE( EXCEPT( UNION( [Measures].Members, {[Measures].[需要包含的计算度量1], [Measures].[需要包含的计算度量2]} ), {[Measures].[Stock Unit Close]} ) ); -- 你的时间计算逻辑 END SCOPE;
方案2:用Filter精准筛选目标度量
如果你需要保留部分计算度量,同时排除特定的那个,用Filter函数遍历筛选会更稳妥,还能避免集合类型冲突:
SCOPE( Filter( [Measures].AllMembers, -- 精准匹配要排除的度量 [Measures].CurrentMember IS NOT [Measures].[Stock Unit Close] -- 可选:如果只想作用于存储度量,加上这个判断 -- AND [Measures].CurrentMember.IsCalculated = FALSE ) ); -- 你的时间计算逻辑 END SCOPE;
额外提示
尽量避免在SCOPE中直接操作包含大量计算度量的集合,因为计算度量的求值顺序依赖于计算脚本的执行顺序,批量覆盖容易导致逻辑混乱。如果可以,优先针对存储度量设置作用域,再单独给需要的计算度量添加逻辑会更清晰。
内容的提问来源于stack exchange,提问作者Miška
相关产品推荐
相关产品推荐

