14

SQL Server で次のバグ (または機能) に遭遇しました。

SUM (*column*)where columnhas typeを使用して、numeric(18, 8)それを他の数値 (整数または小数) に乗算すると、結果の精度は に減少しnumeric(18, 6)ます。

以下は、デモ用のサンプル スクリプトです。

CREATE TABLE #temp (Qnty numeric(18,8))

INSERT INTO #temp (Qnty) VALUES (0.00000001)
INSERT INTO #temp (Qnty) VALUES (0.00000002)
INSERT INTO #temp (Qnty) VALUES (0.00000003)

SELECT Qnty, 1*Qnty
FROM #temp

SELECT (-1)*SUM(Qnty), SUM(Qnty), -SUM(Qnty), SUM(Qnty) * CAST(2.234 as numeric(18,8))
FROM #temp

DROP TABLE #temp

2 番目の SELECT クエリの結果

0.000000    0.00000006  -0.00000006 0.000000

ご覧のとおり、SUM を乗算すると、結果は 0.000000 になります。

誰かが奇妙な振る舞いを説明できますか?

アップデート。2000、2005、および 2008 SQL Server の SQL Management Studio でこのクエリを実行しました。

4

3 に答える 3

8

numeric(18, 8)aをSUMで集計すると 、データ型は になりnumeric(38, 8)ます。

何かを数値で乗算したときに結果のデータ型がどのように計算されるかは、次の場所にあります:精度、スケール、および長さ (Transact-SQL)

定数 -1 のデータ型はnumeric(1, 0)

精度p1 + p2 + 1= 40
スケールs1 + s2= 8

最大精度は 38 で、残りはnumeric(38, 6).

numeric(38, 6)なぜそれがここにあるのかについてもっと読む:数値による乗算と除算

于 2013-01-14T07:42:43.763 に答える
2

SUM のリファレンス ページを読むと、10 進数の列では の型が生成されることがわかりますNUMERIC(38,6)SUM希望どおりに動作させるには、 toの結果をキャストする必要がありNUMERIC(18,8)ます。

実行すると、期待どおりのSELECT CAST(SUM(Qnty) as numeric(18,8)) * 2.234 FROM #temp結果が得0.00000013404られます。

于 2013-01-14T07:53:04.603 に答える
0

技術的な説明はhttp://social.msdn.microsoft.com/Forums/en/transactsql/thread/233f7380-3f19-4836-b224-9f665b852406にあります。

于 2013-01-14T07:34:30.580 に答える