- - PR -
SQLSERVERでSUM関数を使用した場合の丸めについて
1
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2006-08-15 10:58
質問です。
SQLSERVER2005を使用しています。 FIELD1 DECIMAL(10,5) FIELD2 DECIMAL(10,1) というフィールドがあるとして、 下記のようなクエリ SELECT FIELD1 + SUM(FIELD2) AS GOUKEI FROM … を実行すると、結果のGOUKEIフィールドには FIELD2の小数点制度である小数点1位で丸めが行われてしまいます。 ちなみにSUMを使わずに FIELD1 + FIELD2 AS GOUKEI とすると、FIELD1分の精度である少数以下5位までが確保されています。 こちらが求めている結果は少数以下5位までなので 丸めが行われてしまうと意図しない結果となってしまいます。 何か回避策はあるのでしょうか? あるいはクエリでの加算はあきらめるしかないのでしょうか? ご存知の方、よろしくお願いします。 | ||||
|
投稿日時: 2006-08-15 11:14
すみません、自己解決です。
SUM(FIELD2)フィールドに対してキャストを行えば 期待していた結果を得ることができました。 一応回避はできましたが、 この事象自体あまり釈然としません。 なにかご存知の方は教えてください。 | ||||
|
投稿日時: 2006-08-15 12:34
こんにちは。
これは FIELD2 の scale に合わせて丸められたのではなく、SUM 関数の戻り値と FIELD1 とを加算した合計値の precision が38を越えたので scale が減らされたのではないでしょうか。 そう思った根拠は Books Online の 有効桁数、小数点以下桁数、および長さ (Transact-SQL) に載っている情報です。 併せて decimal 型と numeric 型 (Transact-SQL) と SUM (Transact-SQL) を参考にしました。 この推測、いかがでしょうか。 _________________ 上本亮介 (ue) @ わんくま同盟 Microsoft MVP for VSTO (Jul 2008 - Jun 2009) Hello Another World! .NET 勉強会 / ヒーロー島 | ||||
|
投稿日時: 2006-08-16 01:49
私もこのパターンだと思います。 FIELD2に対しSUMを行った場合、 結果のスケールは(38,1)になります。 で、DECIMAL(38,1)の値とDECIMAL(10,5)の値を加算した場合、 結果はDECIMAL(38,1)になりますから。 実証として create table test ( val decimal(10,5)) ; create table test1 ( val decimal(10,1)) ; create table test2 ( val decimal(38,1)) ; insert into test values(1); insert into test1 values(1); insert into test2 values(1); と環境を用意し select test.val + test1.val from test,test1; を実行すると結果が「2.00000」 select test.val + test2.val from test,test2; を実行すると結果が「2.0」となります。 #SQLServer2000、SQLServer2005ともに試して同じ結果でした。 SUMをすると精度がどうしても(38,s)になってしまうので、 CAST(CONVERT)するのは仕方ないのではないでしょうか? _________________ 夏椰 @ わんくま同盟 夏椰の庵 Microsoft MVP for Windows Server System - SQL Server ( Jul 2006 - Jun 2008 ) | ||||
|
投稿日時: 2006-08-16 08:31
ueです。
夏椰さん、フォローありがとうございます。 _________________ 上本亮介 (ue) @ わんくま同盟 Microsoft MVP for VSTO (Jul 2008 - Jun 2009) Hello Another World! .NET 勉強会 / ヒーロー島 | ||||
1
