- PR -

SQLSERVERでSUM関数を使用した場合の丸めについて

1
投稿者投稿内容
TT
会議室デビュー日: 2005/10/25
投稿数: 4
投稿日時: 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位までなので
丸めが行われてしまうと意図しない結果となってしまいます。

何か回避策はあるのでしょうか?
あるいはクエリでの加算はあきらめるしかないのでしょうか?
ご存知の方、よろしくお願いします。
TT
会議室デビュー日: 2005/10/25
投稿数: 4
投稿日時: 2006-08-15 11:14
すみません、自己解決です。

SUM(FIELD2)フィールドに対してキャストを行えば
期待していた結果を得ることができました。

一応回避はできましたが、
この事象自体あまり釈然としません。
なにかご存知の方は教えてください。
ue
ぬし
会議室デビュー日: 2005/05/07
投稿数: 581
お住まい・勤務地: 広島市
投稿日時: 2006-08-15 12:34
こんにちは。

引用:

FIELD2の小数点制度である小数点1位で丸めが行われてしまいます。


これは 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 勉強会 / ヒーロー島
今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2006-08-16 01:49
引用:

ueさんの書き込み (2006-08-15 12:34) より:
これは FIELD2 の scale に合わせて丸められたのではなく、SUM 関数の戻り値と FIELD1 とを加算した合計値の precision が38を越えたので scale が減らされたのではないでしょうか。

この推測、いかがでしょうか。




私もこのパターンだと思います。
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 )
ue
ぬし
会議室デビュー日: 2005/05/07
投稿数: 581
お住まい・勤務地: 広島市
投稿日時: 2006-08-16 08:31
ueです。

夏椰さん、フォローありがとうございます。
_________________
上本亮介 (ue) @ わんくま同盟
Microsoft MVP for VSTO (Jul 2008 - Jun 2009)
Hello Another World!
.NET 勉強会 / ヒーロー島
1

スキルアップ/キャリアアップ(JOB@IT)