SQLServerテーブルの列height
は整数型です。除算を実行し、クエリで結果を小数にしたいのですが、次のようになります。
Select (height/10) as HeightDecimal
HeightDecimal
が整数でなくなるようにキャストするにはどうすればよいですか?ありがとう。
SQLServerテーブルの列height
は整数型です。除算を実行し、クエリで結果を小数にしたいのですが、次のようになります。
Select (height/10) as HeightDecimal
HeightDecimal
が整数でなくなるようにキャストするにはどうすればよいですか?ありがとう。
SELECT height/10.0 AS HeightDecimal FROM dbo.whatever;
特定の精度のスケールが必要な場合は、次のように言います。
SELECT CONVERT(DECIMAL(16,4), height/10.0) AS HeightDecimal
FROM dbo.whatever;
SELECT CAST(height AS DECIMAL(18,0)) / 10
編集: これは内部でどのように機能しますか?
結果の型は両方の引数の型と同じです。異なる場合は、データ型の優先順位テーブルによって決定されます。したがって、どちらの引数も非整数のものにキャストできます。
これDECIMAL(18,0)
で、または同等に書くことができるDECIMAL
のは、依然として一種の整数型です。これは、デフォルトのスケールが0
「小数点の右側に数字がない」ことを意味するためです。したがって、それへのキャストは、さまざまな状況で整数への丸めにうまく機能する可能性があります。これは、私たちが達成しようとしていることとは逆です。
ただし、DECIMALにはすべてに独自のルールがあります。これらは一般に非整数ですが、常に正確な数値です。強制的に発生させたDECIMAL除算の結果タイプは、この場合、DECIMAL(29,11)であると特別に決定されます。したがって、除算の結果は11桁に丸められ、10で除算する必要はありませんが、3で除算すると、丸めが観察可能になります。左側のオペランドのスケールを操作することで、丸めの量を制御できます。式全体の周りに別のROUNDまたはCAST操作を配置することで、より多くの丸めを行うこともできますが、より少なくすることはできません。
同一のメカニズムが、受け入れられた回答のより単純でより優れたソリューションを支配します。
SELECT height / 10.0
この場合、除数DECIMAL(3,1)
の型はであり、結果の型はですDECIMAL(17,6)
。3で割ってみて、丸めの違いを観察してください。
この精度とスケールの話がすべて嫌いで、SQLサーバーに、ある時点から古き良き倍精度浮動小数点演算ですべての計算を実行させたい場合は、それを強制することもできます。
SELECT height / CAST(10 AS FLOAT(53))
または同等にちょうど
SELECT height / CAST (10 AS FLOAT)
高さを小数としてキャストできます。
select cast(@height as decimal(10, 5))/10 as heightdecimal
または、除算する値に小数点を配置します。
declare @height int
set @height = 1023
select @height/10.0 as heightdecimal
例とともにsqlfiddleを参照してください
select cast (height as decimal)/10 as HeightDecimal
declare @xx int
set @xx = 3
select @xx
select @xx * 2 -- yields another integer
select @xx/1 -- same
select @xx/1.0 --yields 6 decimal places
select @xx/1.00 -- 6
select @xx * 1.0 -- 1 decimal place - victory
select @xx * 1.00 -- 2 places - hooray
また、_ intをtemp_tableにdecimal(10,3)のように挿入する_は問題なく機能します。