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

当我运行上述查询时,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,那么该值是什么。有什么解决办法吗?

4

1 回答 1

3

1.#INF或者-1.#INF是分析服务如何显示正/负无穷大,这在技术/数学上是用零除的结果。

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

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 的字符串。

于 2013-09-25T15:03:00.187 回答