SORUN: Bölme içeren bir formül içinde Topla veya ORTALAMA işlevler kullandığınızda, duyarlılık kaybı oluşabilir

Makale çevirileri Makale çevirileri
Makale numarası: 281341 - Bu makalenin geçerli olduğu ürünleri görün.
Hepsini aç | Hepsini kapa

Belirtiler

Bölüm ile TOPLAM veya ORTALAMA toplama işlevini kullandığınızda, sonuç duyarlık kaybeder. Duyarlılık kaybı, sayısal ve ondalık veri türü kullanıp bağımsız olarak gerçekleşir.

Neden

Bu davranış ondalık ve sayısal veri yapısı ve kesinlik ve ölçek değerleri sonucunda oluşan kesme kaynaklanmaktadır. SQL Server Books Online'da göre sum(numeric(p,s)) numeric(38,s) sonucudur. Önceki, sum(amount) numeric(38,9) olduğu. Bir ifade numeric(38,9) elinizde / numeric(15,9); ideal olarak, numeric(63,25) sonucudur. Ancak, en yüksek duyarlık, 38 olduğundan, sonuç (38,6 için) keser.

Pratik Çözüm

Bu davranışa geçici bir çözüm bulmak için <a0></a0>, bu yöntemlerden birini kullanın:
  • Sayısal bölen olarak kullanın. Örneğin,:

    DECLARE @Quantity numeric(15,9)
    SET @Quantity = 3
    
    SELECT Round(CAST(Sum(t1.Amount) AS numeric(15,9))/@Quantity, 9) As Cost
    FROM t1
    
    					
  • Toplamı bir de?i?kene önce saklamak ve değişken, formülde kullanmak. Örneğin,:

    
    declare @quantity numeric (15,9)
    set @quantity = 3
    
    declare @sum numeric (15,9)
    set @sum= (select sum(amount) from t1)
    select @sum/@quantity as cost
    
    					
  • Açık bir değer bir payda yerleştirin. Örneğin:
    select sum(Amount)/3 from t1
    					

Daha fazla bilgi

Davranışı yeniden oluşturmak için <a0></a0>, aşağıdaki sorguyu Sorgu Çözümleyicisi ' çalıştırın:
CREATE TABLE t1 
(
    Amount    numeric(15,9)    
)
GO
INSERT INTO t1( Amount ) VALUES (0.7)
INSERT INTO t1( Amount ) VALUES (1.3)
SELECT Amount FROM t1

/* result (correct, scale = 9)
Amount    
  
----------------- 
.700000000
1.300000000

DECLARE @Quantity numeric(15,9)
SET @Quantity = 3
    
SELECT t1.Amount / @Quantity As Cost
FROM t1
				
yeniden, ölçeğini ve duyarlılığını içinde sonuç doğru.

Ancak bu kodu kullanırsanız

DECLARE @Quantity numeric(15,9)<BR/>
SET @Quantity = 3

SELECT Sum(t1.Amount)/@Quantity As Cost<BR/>
FROM t1
				
.666666 sonucudur.

Açık bir payda değeri sağlarsanız, duyarlılık kaybı oluşmaz. Toplam değer moduna geçirirseniz, duyarlılık kaybı oluşmaz:

select sum(Amount)/3 from t1
GO
select 2.0000000/@quantity

				
yok duyarlılık kaybı, SUM(amount) bir de?i?kene depolar ve sonra değişken kullanırsanız oluşur. Duyarlılık kaybı, yalnızca bölüm ile toplam SUM veya anahtar sözcüğünü AVG, matematiksel bir formül kullandığınızda oluşur.
declare @quantity numeric (15,9)
set @quantity = 3

declare @sum numeric (15,9)
set @sum= (select sum(amount) from t1)

select @sum/@quantity as cost
				

Özellikler

Makale numarası: 281341 - Last Review: 16 Ekim 2003 Perşembe - Gözden geçirme: 3.2
Bu makaledeki bilginin uygulandığı durum:
  • Microsoft SQL Server 7.0 Standard Edition
  • Microsoft SQL Server 2000 Standard Edition
Anahtar Kelimeler: 
kbmt kbprb KB281341 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:281341

Geri Bildirim Ver

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com