You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复MDX错误:遇到无法包含计算成员的集合

MDX计算上期差异报错问题解决

问题描述

需要展示某一度量的上期差异,在Cube计算区域编写了如下脚本:

CREATE MEMBER CURRENTCUBE.[Analysis Period].[Relative Time].[Previous Period]
AS
    null, 
    VISIBLE = 1;      
SCOPE
(
    [Analysis Period].[Relative Time].[Previous Period],
    [Analysis Period].[Period to Date].ALLMEMBERS
);    
SCOPE
(
   DESCENDANTS (
     [Calendar].[Calendar Hierarchy].[All],
     [Calendar].[Calendar Hierarchy].[Year],
     SELF_AND_AFTER
   )
 );   
THIS = 
(
  [Calendar].[Calendar Hierarchy].PREVMEMBER,
  [Analysis Period].[Relative Time].&[1]
);    
END SCOPE;    
END SCOPE;    

CREATE MEMBER CURRENTCUBE.[Analysis Period].[Relative Time].[Variance PrevPd]
AS
(
  [Analysis Period].[Relative Time].&[1] -
  [Analysis Period].[Relative Time].[Previous Period]
), 
VISIBLE = 1;

使用SSMS生成的查询语句如下:

SELECT
    NON EMPTY {[Measures].[Inflow]} ON COLUMNS
FROM
(
  SELECT
  ( {[Analysis Period].[Relative Time].[Variance PrevPd]} ) ON COLUMNS
  FROM
  (
     SELECT
     ( {[Calendar].[Calendar Month].&[202207]} ) ON COLUMNS
     FROM
     (
       SELECT
       ( {[Fact Type].[Transactions or Holdings].&[Transactions]} ) ON COLUMNS
       FROM [Finscape]
     )
   )
)
WHERE
(
  [Fact Type].[Transactions or Holdings].&[Transactions],
  [Calendar].[Calendar Month].&[202207],
  [Analysis Period].[Relative Time].[Variance PrevPd]
)

执行后报错:

A set has been encountered that cannot contain calculated members.

报错原因

这个错误和SCOPE语句无关,核心问题是子查询(Subselect)的轴上不能放置计算成员。子查询的作用是筛选Cube的原生维度成员,而Variance PrevPd是自定义的计算成员,不属于原生维度的成员集合,因此不能放到子查询的COLUMNS/ROWS轴中。

修复方案

1. 优化Cube计算脚本(可选,简化逻辑)

可以去掉SCOPE语句,直接在Previous Period的定义中使用动态成员引用,逻辑更清晰:

CREATE MEMBER CURRENTCUBE.[Analysis Period].[Relative Time].[Previous Period]
AS 
    ([Calendar].[Calendar Hierarchy].CurrentMember.PrevMember, [Analysis Period].[Relative Time].&[1]),
VISIBLE = 1;

CREATE MEMBER CURRENTCUBE.[Analysis Period].[Relative Time].[Variance PrevPd]
AS
    [Analysis Period].[Relative Time].&[1] - [Analysis Period].[Relative Time].[Previous Period],
VISIBLE = 1;

无需依赖SCOPE的上下文,直接通过CurrentMember.PrevMember获取上期数据,逻辑更直观。

2. 修改查询语句(关键修复)

把计算成员从子查询中移到外层查询的轴上,同时简化不必要的嵌套子查询:

SELECT
    NON EMPTY {[Measures].[Inflow]} ON COLUMNS,
    NON EMPTY {[Analysis Period].[Relative Time].[Variance PrevPd]} ON ROWS
FROM [Finscape]
WHERE
(
  [Fact Type].[Transactions or Holdings].&[Transactions],
  [Calendar].[Calendar Month].&[202207]
)

如果需要保留原有的嵌套子查询结构,只需把计算成员移到外层:

SELECT
    NON EMPTY {[Measures].[Inflow]} ON COLUMNS,
    NON EMPTY {[Analysis Period].[Relative Time].[Variance PrevPd]} ON ROWS
FROM
(
  SELECT
  ( {[Calendar].[Calendar Month].&[202207]} ) ON COLUMNS
  FROM
  (
    SELECT
    ( {[Fact Type].[Transactions or Holdings].&[Transactions]} ) ON COLUMNS
    FROM [Finscape]
  )
)
WHERE
(
  [Fact Type].[Transactions or Holdings].&[Transactions],
  [Calendar].[Calendar Month].&[202207]
)

说明

子查询仅能用于筛选原生维度的成员,计算成员必须放在外层查询的轴(COLUMNS/ROWS)或者切片器(WHERE)中。原查询中WHERE子句重复了子查询的筛选条件,可根据需要保留或移除,不影响结果。

内容的提问来源于stack exchange,提问作者Ian Wells

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 00:55:29