5

次の表を使用してSQLServer2008に取り組んでいます。

id      user      program   seconds
------------------------------------
9999  'user01'    'pr01'       5

列'seconds'はdecimal(14,0)として定義され、テーブル内の唯一の行は表示されている行です。

だから私はいくつかのクエリを試してみます:

Q1:

select seconds*0.95 from myTable
union all
select seconds from myTable

それは私が期待する結果を与えます:

4.75
5.00

Q2:

select sum(seconds)*0.95 from myTable
union all
select sum(seconds) from myTable

Q1と同じ結果を期待していましたが、得られる結果は次のとおりです。

5
5

Q3:

select sum(seconds)*0.95 from myTable
union all
select sum(seconds)*1.00 from myTable

この場合、期待する結果が得られます。

4.75
5.00

では、なぜ第2四半期に期待した結果が得られないのかを知りたいと思います。'seconds'がdecimal(2,0)である同じ例を試しましたが、正常に動作するので、decimalのサイズと関係があると思いますが、その場合、Q1とQ3が動作する理由がわかりません。 Q2はしません。

4

1 に答える 1

4

の結果は、sum(seconds)任意numeric(38,0)の数の行を合計できるので意味があり、これによりnumeric(14,0)、小さいタイプのオーバーフローが回避されます。

上部のanumeric(38,0)0.95( )を掛けると、ここでの説明のように結果が得られます。numeric(2,2)numeric(38,2)

しかし、の下部unionnumeric(38,0)全体としてキャストされるため、エラーなしで常にキャストできるように(小数点以下の桁が失われますが)、他の方法でキャストしてもまったく機能しませんnumeric(38,0)。非常に大きな数。numeric(38,2)numeric(38,0)

numeric(38,2)これを回避するために、下部を明示的にキャストできます。

SELECT sum(seconds) * 0.95 AS S
FROM   myTable
UNION ALL
SELECT CAST(sum(seconds) AS NUMERIC(38, 2))
FROM   myTable 
于 2012-11-16T13:03:12.160 に答える