我在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参数。使用了元组集表达式。
答案 0 :(得分:1)
Filter函数返回 set ,因此您的错误消息:
https://msdn.microsoft.com/en-us/library/ms146037.aspx
返回根据搜索条件过滤指定集合而得到的集合。
所以你试图用一个数字来划分成员的集。
要解决此问题,您需要一个数字表达式而不是一个集合。数字表达式是以下之一:
对于刚接触该语言的人来说,第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异常