アプリ版:「スタンプのみでお礼する」機能のリリースについて

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に入れて計算させると、ちゃんと正しい結果が出ます。

何が原因なのでしょうか?

A 回答 (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
118.97101449275362318
227.14516129032258064
344.62500000000000000
421.65625000000000000
5153.00000000000000000
633.00000000000000000
763.00000000000000001
    • good
    • 0
この回答へのお礼

す、すごい…(+_+)

たしかに、変数の型というのは盲点でした。

型が違うことで計算結果が変わるというのは困りますね。
そういう場合はエラーが出るものだと勝手に思い込んでました。

ご回答ありがとうございました。

お礼日時:2012/05/25 22:45

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す