MDX计算脚本:带有元组集和范围的语法错误

时间:2018-03-29 16:34:01

标签: ssas mdx olap-cube

我尝试在多维数据集的MDX计算中设计计算,以便在使用维度的特定值时,度量返回的行为/值会更改为其他内容,具体取决于来自同一维度属性的其他值。

这是我的代码示例:

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;

我们在这里看到的是,我想要创建一个具有某种维度的元组'指标'值,除了一个。我在此维度属性中有3000多个值。

接下来,当用户选择属性指标时,以及所选择的值中,一个是“指标每日差异”,我想要更改度量返回的值'价值单位',而是从每日差异单位'中获取值。

这最后一项措施已经过测试和运作。

到目前为止,我已设法使用当前未注释的代码获得结果。但正如您所看到的,这仅适用于“指标”的1个值。维度,当我需要让它成千上万的时候。

我已尝试使用子注册表,您可以在评论代码中看到,但我得到了这个例外:

  

当前上下文中不允许使用任意形状的集。

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

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

然而,我最终会得到一个' null'我的立方体中的值(非空或未显示,单元格填充为null)。

我不是SSAS专家,而且我主要做的事情是希望找到一些关键词来查找,但到目前为止,互联网博客对我的主题几乎没有信息,我可以找到我周围的人对这项技术有足够的了解。

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

PS:我不能用一个措施来解决这个问题。我的客户明确要求提供这个每日差异单元'显示为指标,以便只有一个度量,并且需要尽可能多的指标。

修改

我做了这个改变,确实它解决了任意形状的套装'错误。但现在我在查询时没有得到任何数字。

我可以看到其他'指标'上的其他数字,但是[指标每日差异]指标没有返回任何单元格。我现在正在使用它:

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; 

2 个答案:

答案 0 :(得分:2)

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

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; 

答案 1 :(得分:0)

(代表问题作者发布)

按照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;

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