无法过滤掉1.#INF值

时间:2013-09-25 12:37:44

标签: mdx

SELECT NON EMPTY {{[Measures].[Net Promoter Score],[Measures].[AvgRevenuePerUnit]}} ON COLUMNS ,
NON EMPTY {{Hierarchize(DrilldownLevel(DrilldownLevel(DrilldownLevel([Employees].[Boss].[ALL]))))}} 
ON ROWS
FROM (SELECT ({[Employees].[Boss].&[14404]}) ON COLUMNS
FROM [Enterprise]
WHERE FILTER([Employees].[EID].[EID],[Measures].[Avg Revenue Per Unit] > 700)) 
WHERE ({[Employees].[Active Status].&[False]},{[Roles].[Roster Role].&[486]},{[Roles].[Enterprise Role].&[2]},
{[Locations].[Location].&[6]},{[Areas].[Area].&[3]},{[Markets].[Market].&[1]},{[Regions].[Region].&[2]},
{[Dates].[Date].&[20130218]:[Dates].[Date].&[20130319]})

当我运行上面的查询时,AvgRevenuePerUnit列显示1.#INF。要将1.#INF替换为0,我使用下面给出的查询,但结果是相同的。我在下面的查询中使用WITH MEMBER。

WITH MEMBER [Measures].[AvgRevenuePerUnit] AS (IIF([Measures].[Avg Revenue Per Unit] = '1.#INF', 0, [Measures].[Avg Revenue Per Unit])), Format_String = '0.#0'
SELECT NON EMPTY {{[Measures].[Net Promoter Score],[Measures].[AvgRevenuePerUnit]}} ON COLUMNS ,
NON EMPTY {{Hierarchize(DrilldownLevel(DrilldownLevel(DrilldownLevel([Employees].[Boss].[ALL]))))}} 
ON ROWS
FROM (SELECT ({[Employees].[Boss].&[14404]})  ON COLUMNS
FROM [Enterprise] WHERE FILTER([Employees].[EID].[EID],[Measures].[Avg Revenue Per Unit] > 700)) 
WHERE ({[Employees].[Active Status].&[False]},{[Roles].[Roster Role].&[486]},{[Roles].[Enterprise Role].&[2]},
{[Locations].[Location].&[6]},{[Areas].[Area].&[3]},{[Markets].[Market].&[1]},{[Regions].[Region].&[2]},
{[Dates].[Date].&[20130218]:[Dates].[Date].&[20130319]})

我有一个由用户提供的多维数据集,我从该多维数据集查询数据。在我看来,立方体中的实际值不是1.#INF这就是为什么它不会替换为0.但是如果它不是1,则该值是多少。#INF。 任何解决方案?

1 个答案:

答案 0 :(得分:2)

1.#INF-1.#INF是Analysis Services显示加/减无穷大的方式,从技术上/数学上是将某事物除以零的结果。

避免这种情况的最佳方法是在度量的定义中,可能在多维数据集的计算脚本中。你可能有像

这样的东西
CREATE MEMBER CurrentCube.[Measure].[AvgRevenuePerUnit] AS A / B
      , VISIBLE = 1;

将其替换为

CREATE MEMBER CurrentCube.[Measure].[AvgRevenuePerUnit] AS IIf(B <> 0, A / B, null)
      , VISIBLE = 1;

你完成了。当然,请酌情替换AB

注意:Analysis Services 2012最近有一个更新,其中包含一个允许编写的新MDX函数Divide

CREATE MEMBER CurrentCube.[Measure].[AvgRevenuePerUnit] AS Divide(A, B)
      , VISIBLE = 1;

如果您和所有其他用户真的必须坚持使用多维数据集中的定义,并且必须依赖于查询中的WITH子句,那么我认为您的代码可以编写为

WITH MEMBER [Measures].[AvgRevenuePerUnit] AS
     IIF([Measures].[Avg Revenue Per Unit] = 1 / 0         --  '1.#INF', plus infinity
            OR [Measures].[Avg Revenue Per Unit] = -1 / 0, -- '-1.#INF', minus infinity
         0,
         [Measures].[Avg Revenue Per Unit]),
     Format_String = '0.#0'
...

使用'1.#INF'的方法不起作用,因为这是一个字符串,无限数字是数字而不是Analysis Services的字符串。