SSAS MDX查询localRate计算结果不符合预期问题排查
问题根因
你的猜测是正确的,问题核心出在allPatsOneSpe的定义上,同时对计算成员、查询级集合的计算上下文理解存在偏差:
- 查询级别的
SET是在查询执行的最早阶段一次性静态计算完成的,计算时[Dim misc].[SpePats].CurrentMember是该层次结构的默认All成员,后续不管元组切换到哪个Speciality Id,allPatsOneSpe的内容都不会再更新,所以rate成员永远统计的是All层级的患者数量,不会随着传入的Speciality Id动态变化。 - 你对localRate元组的上下文传递理解部分正确,维度上下文确实会传递到
rate的计算中,但allPatsOneSpe已经是静态结果,不会响应上下文变化,所以你的预期逻辑没有生效。 - 另外注意你代码中
rate用到的existing写法也存在错误,existing关键字的作用是将集合按照当前查询上下文切片,正确写法是existing [集合],你写的元组包裹形式不符合语法规范,不会生效。
解决方案
方法1:把allPatsOneSpe从查询级集合改成rate内部的动态计算逻辑
不要预定义查询级的allPatsOneSpe,直接在rate计算成员内部实时生成对应专科的患者集合,修改后的rate定义如下:
MEMBER [Measures].rate AS Descendants([Dim misc].[SpePats].CurrentMember,2).Count
如果需要保留原来的SpePats2过滤逻辑,调整为:
MEMBER [Measures].rate AS Exists(Descendants([Dim misc].[SpePats].CurrentMember,2), [Dim misc].[SpePats2].CurrentMember).Count
方法2:使用MDX计算度量的动态特性,直接关联属性
如果你的SpePats层次结构和Speciality Id属性是直接关联的,也可以直接用维度属性关联度量组的方式实现,不需要手动写Descendants逻辑,性能会更优。
调整后的验证方式
修改完成后可以先运行简化版查询验证localRate是否符合预期:
WITH MEMBER [Measures].rate AS Descendants([Dim misc].[SpePats].CurrentMember,2).Count MEMBER localRate as ([Dim misc].[Speciality Id].&[{754EFA13-AA1B-4E57-AB73-893AF7C52127}], [Measures].rate) SELECT {localRate, nballPatsOneSpe} ON 0 FROM [BDD PBM]
如果两者返回结果一致,说明逻辑已经正确,再把调整后的rate代入完整的百分位计算逻辑即可。
内容的提问来源于stack exchange,提问作者lolveley
相关产品推荐
相关产品推荐

