使用MDX时,除法函数需要字符串或数字

时间:2015-03-19 16:56:52

标签: mdx

我在MDX中有表达

IIF
(
  IsEmpty
  (
        Filter
        (
          [Measures].[Actual  Hours]
         ,
          [WORK ACTUAL].[MAINT D].[Maintenance Code] = 'PRO'
        )
      / 
        [Measures].[Actual  Hours]
    * 100
  )
 ,0
 ,
      Filter
      (
        [Measures].[Actual  Hours]
       ,
        [WORK ORDER ACTUAL].[MAINT D].[Maintenance Code] = 'PRO'
      )
    / 
      [Measures].[Actual  Hours]
  * 100
)

我收到以下错误:

  

MdxScript(test)除法函数需要字符串或数字   表达式为1参数。使用了元组集表达式。

3 个答案:

答案 0 :(得分:1)

Filter函数返回 set ,因此您的错误消息:
https://msdn.microsoft.com/en-us/library/ms146037.aspx

  

返回根据搜索条件过滤指定集合而得到的集合。

所以你试图用一个数字来划分成员的

要解决此问题,您需要一个数字表达式而不是一个集合。数字表达式是以下之一:

  1. 一个数字
  2. 数字度量
  3. 数字格式的成员资产
  4. 元组的结果
  5. 对于刚接触该语言的人来说,第4号可能是mdx中最棘手的概念。

    正如@BillAnton所说,这是一个元组,因此是一个数字表达式:

    ([WORK ACTUAL].[MAINT D].&[PRO],[Measures].[Actual  Hours])
    

    这也是一个元组和数字表达式:

    ([WORK ACTUAL].[MAINT D].&[PRO])
    

    它将简单地使用脚本上下文中使用的度量或多维数据集默认度量。

    同样在Filter的定义中,您可以看到它的签名如下:

      

    过滤(Set_Expression,Logical_Expression)

    在您的脚本中,您有以下

    Filter
        (
          [Measures].[Actual  Hours] //<<measures are numeric_expression
         ,
          [WORK ACTUAL].[MAINT D].[Maintenance Code] = 'PRO'
        )
    

    在摆脱错误方面,这是1分辨率:

    IIF
    (
          //10 is a numeric placeholder (you can replace with something that returns a number)
          10 / [Measures].[Actual  Hours]
        * 100
      = 0
     ,0
     ,
        //20 is a numeric placeholder (you can replace with something that returns a number)
        20 / [Measures].[Actual  Hours]
      * 100
    )
    

答案 1 :(得分:1)

您没有正确使用过滤功能。过滤函数通常用于通过度量或其他一些计算逻辑过滤一组元组。为了过滤特定成员的度量(我认为你正在尝试做),你可以简单地创建一个元组......

([WORK ACTUAL].[MAINT D].&[PRO],[Measures].[Actual  Hours])

使用与[工作实际]维度中[Maint D]属性的[PRO]成员关联的事实记录计算实际小时数(使用定义的聚合函数,最有可能是SUM)。根据你的维度/属性/等的设置方式,这可能不是精确的语法......但希望你能理解。

MEMBER [Measures].[<calc-measure-stage1>]
    IIF(
        [Measures].[Actual  Hours] = 0
        ,NULL
        ,(
            (
                 [WORK ACTUAL].[MAINT D].&[PRO]
                ,[Measures].[Actual  Hours]
            )
            /
            [Measures].[Actual  Hours]
         ) * 100
    )
MEMBER [Measures].[<calc-measure-stage2>]
    IIF(
        [Measures].[Actual  Hours] = 0
        ,NULL
        ,(
            (
                 [WORK ORDER ACTUAL].[MAINT D].&[PRO]
                ,[Measures].[Actual  Hours]
            )
            /
            [Measures].[Actual  Hours]
         ) * 100
    )
MEMBER [Measures].[<calc-measure>]
    IIF(
         IsEmpty([Measures].[<calc-measure-stage1>]
        ,[Measures].[<calc-measure-stage2>]
        ,[Measures].[<calc-measure-stage1>]
    )

答案 2 :(得分:0)

使用CoalesceEmpty(Expression,NumaricValue)进行数值测量

还可以使用DIVIDE(Numerator,Denominator,0)自动处理0异常