MDX中使用EXISTING函数返回结果偏差过大,请求技术排查
MDX中EXISTING函数求和结果偏差问题排查
我尝试使用EXISTING函数计算所选多个成员的总和,编写的MDX语句无语法错误,但返回的数值结果与预期偏差极大——比如正确值应为-58,638,语句返回了26,513,062。语句如下([BusinessUnit].&[1]是层级的顶层):
Case When (BusinessUnit.CurrentMember is [BusinessUnit].&[1]) then [Account].&[1443] + [Account].&[938] + [Account].&[1141] + [Account].&[1144] + [Account].&[1095] + ([Account].&[1440],[BusinessUnit].&[44]) + ([Account].&[1147],[BusinessUnit].&[44]) else Sum (EXISTING [BusinessUnit].Members * {[Account].&[1443] , [Account].&[938] , [Account].&[1141] , [Account].&[1144] , [Account].&[1095] }) End
问题根源
- EXISTING误用导致重复计算:
EXISTING [BusinessUnit].Members会返回当前上下文中所有存在的业务单元成员,和指定账户集合做叉乘后,Sum会计算每个账户成员与所有业务单元成员组合的总和,相当于把目标值重复计算了N次(N为当前上下文的业务单元数量),这就是结果异常放大的核心原因。 - else分支逻辑偏离需求:你需要的是当前选中业务单元下指定账户的总和,但原逻辑遍历了所有业务单元,而非仅当前成员。
修正方案
方案1:直接计算当前业务单元下的指定账户总和
去掉不必要的业务单元集合叉乘,直接对账户集合求和:
Case When (BusinessUnit.CurrentMember is [BusinessUnit].&[1]) then [Account].&[1443] + [Account].&[938] + [Account].&[1141] + [Account].&[1144] + [Account].&[1095] + ([Account].&[1440],[BusinessUnit].&[44]) + ([Account].&[1147],[BusinessUnit].&[44]) else Sum( {[Account].&[1443] , [Account].&[938] , [Account].&[1141] , [Account].&[1144] , [Account].&[1095]} ) End
方案2:保留EXISTING确保账户成员在当前上下文存在
如果需要过滤掉当前上下文不存在的账户成员,可以用EXISTING限定账户集合:
Case When (BusinessUnit.CurrentMember is [BusinessUnit].&[1]) then [Account].&[1443] + [Account].&[938] + [Account].&[1141] + [Account].&[1144] + [Account].&[1095] + ([Account].&[1440],[BusinessUnit].&[44]) + ([Account].&[1147],[BusinessUnit].&[44]) else Sum( EXISTING {[Account].&[1443] , [Account].&[938] , [Account].&[1141] , [Account].&[1144] , [Account].&[1095]} ) End
补充提示
- 如果查询未显式指定度量值,MDX会使用默认度量值,请确保默认度量值是你需要计算的指标。
- 顶层分支的硬编码组合逻辑可改用
Sum包裹集合,提升代码可读性。
内容的提问来源于stack exchange,提问作者Skizzy
相关产品推荐
相关产品推荐

