• ベストアンサー

SQLでの計算結果がおかしい

SQLで調和平均(もどき)を計算したいのですが、下のようなSQL文で計算した結果が正しく出ないのです。 select ID, 3 / ((1 / (A1 + 1) + 1 / (B1 + 1)) + 1 / (C1 + 1)) as HARMEAN from TABLE (各項に1を足しているのは、ゼロ除算を避けるための苦肉の策です) たとえば、A1=20, B1=10, C1=50 の場合、上記の結果が27.14と出ます。 (正しい計算結果は18.97のはずです) ちなみに、上とまったく同じ式をExcelに入れて計算させると、ちゃんと正しい結果が出ます。 何が原因なのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

A1, B1, C1の型は何ですか。 こちらで試した結果から,A1の型がINT型になっているのではないでしょうか。 ---- TEST ---- DECLARE @table1 TABLE ( A1 DECIMAL, B1 DECIMAL, C1 DECIMAL ) DECLARE @table2 TABLE ( A1 INT, B1 DECIMAL, C1 DECIMAL ) DECLARE @table3 TABLE ( A1 DECIMAL, B1 INT, C1 DECIMAL ) DECLARE @table4 TABLE ( A1 DECIMAL, B1 DECIMAL, C1 INT ) DECLARE @table5 TABLE ( A1 INT, B1 INT, C1 DECIMAL ) DECLARE @table6 TABLE ( A1 INT, B1 DECIMAL, C1 INT ) DECLARE @table7 TABLE ( A1 DECIMAL, B1 INT, C1 INT ) INSERT @table1 VALUES ( 20, 10, 50 ) INSERT @table2 VALUES ( 20, 10, 50 ) INSERT @table3 VALUES ( 20, 10, 50 ) INSERT @table4 VALUES ( 20, 10, 50 ) INSERT @table5 VALUES ( 20, 10, 50 ) INSERT @table6 VALUES ( 20, 10, 50 ) INSERT @table7 VALUES ( 20, 10, 50 ) select 1, 3 / ((1 / (A1 + 1) + 1 / (B1 + 1)) + 1 / (C1 + 1)) as HARMEAN from @table1 UNION ALL select 2, 3 / ((1 / (A1 + 1) + 1 / (B1 + 1)) + 1 / (C1 + 1)) as HARMEAN from @table2 UNION ALL select 3, 3 / ((1 / (A1 + 1) + 1 / (B1 + 1)) + 1 / (C1 + 1)) as HARMEAN from @table3 UNION ALL select 4, 3 / ((1 / (A1 + 1) + 1 / (B1 + 1)) + 1 / (C1 + 1)) as HARMEAN from @table4 UNION ALL select 5, 3 / ((1 / (A1 + 1) + 1 / (B1 + 1)) + 1 / (C1 + 1)) as HARMEAN from @table5 UNION ALL select 6, 3 / ((1 / (A1 + 1) + 1 / (B1 + 1)) + 1 / (C1 + 1)) as HARMEAN from @table6 UNION ALL select 7, 3 / ((1 / (A1 + 1) + 1 / (B1 + 1)) + 1 / (C1 + 1)) as HARMEAN from @table7 (列名なし) HARMEAN 1 18.97101449275362318 2 27.14516129032258064 3 44.62500000000000000 4 21.65625000000000000 5 153.00000000000000000 6 33.00000000000000000 7 63.00000000000000001

mtkame
質問者

お礼

す、すごい…(+_+) たしかに、変数の型というのは盲点でした。 型が違うことで計算結果が変わるというのは困りますね。 そういう場合はエラーが出るものだと勝手に思い込んでました。 ご回答ありがとうございました。

関連するQ&A