2013-09-25 47 views
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。用0代替1.#INF,我用下面给出的查询,但结果是一样的。我在下面给出的查询中使用WITH MEMBER。无法过滤1.#INF值

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

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

回答

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

注:有分析服务2012最近的更新,其中包含一个新的MDX功能Divide允许写

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

如果你和所有其他用户真正拥有与定义要坚持,因为它是在立方体,并且要依靠与查询子句,那么我想你的代码可以这样写

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

+0

太棒了! FrankPI :) – Soofian

+0

我还想要一件事。我想从上面给出的查询中滤除1.#INF值。我怎样才能做到这一点 ? – Soofian

+0

@ user2815197要隐藏无限值,只需使用NULL而不是0来代替无限值(我的答案的“WITH”子句中的'IIF'的三个参数的第二个)。然后行的NON EMPTY会导致这些行消失。 – FrankPl