Analysis Services のデータが '-0'(マイナスゼロ)と表示される

森  隆博
SQL Developer Support Engineer

Excel 2007 や SQL Server Management Studio で SQL Server Analysis Services のキューブの値を参照した際、'0' のデータが '-0' (マイナスゼロ)と表示されることがあります。
マイナスゼロの対処方法を記事にしました。

要因

この現象は、Analysis Services における Double 型や Float 型の項目にて -1 と 0 の乗算を行った結果が -0 の結果となる事に起因し発生します。
たとえば、メジャーの Col1 が 0 で Col2 が -1 の値のとき、以下のような計算されるメンバーの計算を実施し、表示すると -0 の表示結果となります。

  [Measures].[Col1] * [Measures].[Col2]

Analysis Services の浮動小数点型は IEEE 754 に準拠しているため、ゼロは2種類存在します。+0(符号部が0)と、-0(符号部が1)です。この規格では、浮動小数点数データの -1 と 0 の乗算の結果は -0 となります。

  -- 参考情報
  Double 構造体
  抜粋 :Double 値型は、-1.79769313486232e308 から +1.79769313486232e308 までの倍精度 64 ビット数値、正の 0 または負の 0、PositiveInfinity、NegativeInfinity、および非数 (NaN) を表します。
  Double は、2 進の浮動小数点演算に関する IEC 60559:1989 (IEEE 754) 規格に準拠しています。

SQL Server にて、コマンドプロンプトから実行できる sqlcmd ユーティリティを使用し、単純な計算を実施しても -0 が表現されます。

   C:\>sqlcmd -Stest -E
   1> select cast(-1 as float) * 0
   2> go

   ------------------------
                         -0

   (1 行処理されました)

このことからも、内部では -0 の計算結果が得られる事を示しています。

  -- 参考情報
  sqlcmd ユーティリティ

対処方法
この現象を回避するために、-0 という表記をサーバーサイドで吸収するか、クライアントサイドで吸収するという選択肢があります。

クライアントサイドで対処する場合
・Excel 2007 にて該当箇所を数値書式に変更する。
・Excel 2010 を使用する。(Excel 2010では、-0を自動的に0に変換し表示します。)

サーバーサイドで対処する場合
計算されるメンバーにて「-0 の場合 0 に変換する」という条件文を追記する。

変更前
  [Measures].[Col1] * [Measures].[Col2]

変更後
  case

     when [Measures].[Col1] * [Measures].[Col2] = -0
      then 0
 
  else
      [Measures].[Col1] * [Measures].[Col2]

  end