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 の最近の更新があり、Divide書き込みを可能にする新しい MDX 関数が含まれています。

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 に答える