2013-08-26 21 views
5

Bu SQL yürütmek zamanMSSQL - tüm farklı ondalık hassasiyetle birlik

SELECT 1.4 UNION ALL 
SELECT 2.0400 union all 
SELECT 1.24 

ben şu sonucu alırsınız:

1,4000
2,0400
1,2400

Ama ne zaman SQL

'ü yürütün

aşağıdaki bilgilerine ulaşabilirsiniz

1,4
2,0
1,2

Ne neden hassas (ölçek) 'de bir fark var tüm kayıtlar için uygulanır? 1 sql gibi, verilerin kaybolmadığı her zaman hassasiyeti kullanmamalıdır.

Thx.

cevap

0

deneyin

SELECT Cast(Sum(1.4) As Numeric(18,4)) UNION ALL 
SELECT Cast(Sum(2.0400) As Numeric(18,4)) union all 
SELECT Cast(Sum(1.24) As Numeric(18,4)) 
0

, aynı sonuç için bu deneyin bu

SELECT sum(1.4)/1.0 UNION ALL 
SELECT sum(2.0400)/1.0 union all 
SELECT sum(1.24)/1.0 

VEYA

SELECT sum(1.4)/1.0 UNION ALL 
SELECT sum(2.0400) union all 
SELECT sum(1.24) 
0

Normal Sorgu aksi toplamını kullanarak veya onluya Dize değeri geçen dize belirtilen dönüştürmek olduğunu Bu biçimlendir aslında

SELECT sum(convert(decimal,1.4,3)) UNION ALL 
SELECT sum(2.0400) union all 
SELECT sum(1.24) 
0

Bu oldukça eski bir soru olduğunu biliyorum

SELECT convert(decimal(18,4),Sum(1.4)) UNION ALL 

SELECT convert(decimal(18,4),Sum(2.0400)) UNION ALL 

SELECT convert(decimal(18,4),Sum(1.24)) 
3

bu Sorgu deneyin ancak mevcut cevapların hiçbiri hitap görünüyor "neden?" sorunuza bakış açısı.

İlk olarak, sözcük ifadeleriniz için veri türü nedir? Ben emin değildi (ve o kadar bakmadı) bu yüzden aşağıdaki koştum: hata verir

select 1.4 union all 
select 'frob' 

:

Msg 8114, Level 16, State 5, Line 1
Error converting data type varchar to numeric.

Tamam, 1.4 ve diğer değişmezleri numeric vardır - decimal.

bir decimal(p,s) geçtiyseniz SUM fonksiyonun dönüş tipi, ne Ardından:

decimal(38, s)

Tamam, sorgunuzdaki 3 SUM ifadelerin veri türleridir decimal(38,1), decimal(38,4) ve decimal(38,2).decimal(38,1) arasından seçim yapabileceğiniz 3 veri türü göz önüne alındığında, differing precisions and scales kurallarına dayalı olarak son seçilen türdür.

The result precision and scale have an absolute maximum of 38. When a result precision is greater than 38, the corresponding scale is reduced to prevent the integral part of a result from being truncated.

Yani, nihayet, geri decimal üzerine belgelerine:

By default, SQL Server uses rounding when converting a number to a decimal or numeric value with a lower precision and scale. However, if the SET ARITHABORT option is ON, SQL Server raises an error when overflow occurs. Loss of only precision and scale is not sufficient to raise an error.

Demek nihai sonuç bu. genellikle, sum birden çok satır karşı olacağını fark kadar ilk bu tip anda


, şaşırtıcı görünebilir ve kendi veri türünü taşmaya verilen bir duyarlık ve ölçek birden çok değer için kolayca mümkündür. , için herhangi bir hassasiyeti kaybetmeden taşmaları karşılamak için mümkün olan en geniş alanı verir ve son veri türünün sorgulamadan önce kararlaştırılabileceği anlamına gelir.