MDX 错误,除法函数需要一个字符串或数字

Error with MDX the divide function expects a string or numeric

我在 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)the divide function expects a string or numeric expression for the 1 argument. A tuple set expression was used .

过滤函数returns一个设置因此你的错误信息:
https://msdn.microsoft.com/en-us/library/ms146037.aspx

Returns the set that results from filtering a specified set based on a search condition.

所以您正试图将 成员除以一个数字。

要解决它,您需要一个数值表达式而不是一个集合。数值表达式为以下之一:

  1. 一个数
  2. 一个数字度量
  3. 一个数字格式的成员属性
  4. 元组的结果

可能数字 4 是 mdx 中对于刚接触该语言的人来说最难以理解的概念。

正如@BillAnton 所提到的,这是一个元组,因此是一个数值表达式:

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

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

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

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

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

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
)

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

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

这会使用与 [Work Actual] 维度中 [Maint D] 属性的 [PRO] 成员关联的事实记录来计算实际小时数(使用定义的聚合函数,这很可能是 SUM)。根据您的 dimension/attribute/etc 设置方式,这可能不是准确的语法...但希望您明白了。

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>]
    )

对数值度量使用 CoalesceEmpty(Expression, NumaricValue)

同时使用 DIVIDE(Numerator, Denominator, 0) 自动处理除以 0 异常