MDX 计算脚本:元组集和范围存在语法错误

MDX Calculation script : syntax error with tuple set and scope

我正在尝试在多维数据集的 MDX 计算中设计一个计算,以便在使用维度的特定值时,度量返回的 behavior/values 会根据其他值更改为其他值来自相同的维度属性。

这是我的代码示例:

CREATE SET CURRENTCUBE.[NonBreakDownIndicators]
AS {([Indicator Label].[Indicator].MEMBERS - [Indicator Label].[Indicator].&[Indicator Daily Diff])}
; 


SCOPE([Measures].[Value Unit], [Indicator Label].[Indicator].&[Indicator Daily Diff]);
   //SCOPE([NonBreakDownIndicators]);
        THIS = ([Indicator Label].[Indicator].&[SensiDiv],[Measures].[Daily Diff Unit]);   
        //THIS = [Measures].[Daily Diff Unit];   
    //END SCOPE;
END SCOPE;

我们在这里可以看到,我想创建一个具有某些维度 'Indicator' 值的元组,除了一个。我在这个维度属性中有 3000+ 个值。

接下来,当一个用户select,除其他外,属性Indicator,在selected值中,一个是'Indicator Daily Diff',我想改变返回的值度量 'Value Unit',而不是从 'Daily Diff Unit' 获取值。

最后一项措施已经过测试并且有效。

到目前为止,我已经设法用当前未注释的代码得到了结果。但是正如您所见,这仅适用于 'Indicator' 维度的 1 个值,而我需要使其适用于数千个维度。

我已尝试使用子范围,如您在注释代码中所见,但出现此异常:

An arbitrary shape of sets is not allowed in the current context.

我还尝试在 THIS 语句中使用元组集 [NonBreakDownIndicators],如下所示:

SCOPE([Measures].[Value Unit], [Indicator Label].[Indicator].&[Indicator Daily Diff]);
        THIS = ([NonBreakDownIndicators],[Measures].[Daily Diff Unit]);   
END SCOPE; 

但是我最终会在我的多维数据集中得到一个 'null' 值(不为空或不显示,单元格填充为空)。

我不是 SSAS 专家,我主要做的事情是希望获得一些关键字来查找,但到目前为止,互联网博客上关于我的主题的信息很少,我可以找到我周围任何有足够知识的人关于这项技术。

有没有人知道我如何在不必指定 MDX 的每个指标的情况下实现这一点?

PS: 我没有办法解决这个问题。我的客户明确要求将此 'Daily Diff Unit' 显示为指标,以便只有一个指标,以及他们需要的尽可能多的指标。

编辑

我做了这个更改,确实它解决了 'arbitrary shape of sets' 错误。但是现在查询时我没有得到任何数字。

我可以在其他 'Indicators' 上看到其他数字,但是 [Indicator Daily Diff] 指标没有返回单元格。我现在正在使用它:

CREATE SET CURRENTCUBE.[NonBreakDownIndicators]
AS {([Indicator Label].[Indicator].[Indicator].MEMBERS - [Indicator Label].[Indicator].&[Indicator Daily Diff])}
; 

SCOPE([Measures].[Value Unit], [Indicator Label].[Indicator].&[Indicator Daily Diff]);
     SCOPE([NonBreakDownIndicators]);             
        THIS = ([NonBreakDownIndicators],[Measures].[Daily Diff Unit]);   
    END SCOPE;
END SCOPE; 

尝试将设置更改为以下内容,看看是否可以避免任意形状错误:

CREATE SET CURRENTCUBE.[NonBreakDownIndicators]
AS {([Indicator Label].[Indicator].[Indicator].MEMBERS - [Indicator Label].[Indicator].&[Indicator Daily Diff])}
; 

您可以在该集合中拥有单个级别和范围的随机成员。但是你不能在那个集合上有多个级别和范围的随机成员。上面的更改从集合中删除了所有成员,我认为这应该确保集合中的所有成员都处于同一级别。

那我试试:

SCOPE([Measures].[Value Unit], [Indicator Label].[Indicator].&[Indicator Daily Diff]);
        THIS = ([Measures].[Daily Diff Unit]);   
END SCOPE; 

或者可能:

SCOPE([Measures].[Value Unit], [Indicator Label].[Indicator].&[Indicator Daily Diff]);
        THIS = SUM([NonBreakDownIndicators],[Measures].[Daily Diff Unit]);   
END SCOPE; 

(代题作者发表).

根据 Greg 的建议,这是完美满足我需求的 MDX 代码:

CREATE DYNAMIC SET CURRENTCUBE.[NonBreakDownIndicators]
AS {(
[Indicator Label].[Indicator].[Indicator].MEMBERS 
- [Indicator Label].[Indicator].&[Indicator Daily Diff]
- [Indicator Label].[Indicator].&[Params Variation]
- [Indicator Label].[Indicator].&[Secondary Variation]
- [Indicator Label].[Indicator].&[Primary Variation]
- [Indicator Label].[Indicator].&[Expired Variation]
)};  

SCOPE([Measures].[Value Unit], [Indicator Label].[Indicator].&[Indicator Daily Diff]);
        THIS = SUM([NonBreakDownIndicators],[Measures].[Daily Diff Unit]); 
END SCOPE;

SCOPE([Measures].[Value k¤], [Indicator Label].[Indicator].&[Indicator Daily Diff]);
        THIS = SUM([NonBreakDownIndicators],[Measures].[Daily Diff k¤]); 
END SCOPE;

它甚至允许我拒绝其他度量值组的行为(简单值、计数器值等)。它支持当前使用的指标并过滤掉其他指标。