環境
Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64) Sep 24 2019 13:48:23 Copyright (C) 2019 Microsoft Corporation Standard Edition (64-bit) on Windows Server 2019 Essentials 10.0 <X64> (Build 17763: )
前提
DBに登録されている数値の平均値を取得するためにAVG関数を用いたところ、
思わぬ結果が出ました。
AVG関数の仕様を調べるため下記コードを作成したところ
SQL
1select AVG(val) result 2from ( 3 select CONVERT(decimal,'23') val 4 union all 5 select CONVERT(decimal,'22.5') val 6) as test
予想は「22.75」となるつもりでしたが結果は「23.000000」となります。
試しに下記コードを試したところ
SQL
1select AVG(val) result 2from ( 3 select CONVERT(float,'23') val 4 union all 5 select CONVERT(float,'22.5') val 6) as test
予想通り「22.75」と結果が出ます。
疑問
①Floatは小数を2進数で取扱ため厳密な計算は出来ないが、Decimalは小数も10進数で計算されるため、
より厳密な計算をされるという認識なのですが誤っているのでしょうか?
②Decimal型を用いた時にどういった計算(丸めが原因?)で結果が「23.000000」となるのでしょうか?
備考
数値が文字型なのはテーブル定義は他者が行っており、
どういうわけかわかりませんが、列の型がNvarcharで定義されているため、
テーブル定義に合わせてテスト用SQLを作成しております。
回答1件
あなたの回答
tips
プレビュー