PRB: Verlust der Genauigkeit kann auftreten, bei SUM oder AVG-Funktion in einer Formel mit Division

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 281341 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Alles erweitern | Alles schließen

Problembeschreibung

Wenn Sie die Aggregatfunktion SUM oder AVG mit Division verwenden, verliert das Ergebnis mit einfacher Genauigkeit. Verlust der Genauigkeit tritt unabhängig davon, ob Sie einen numeric oder decimal-Datentyp verwenden.

Ursache

Dieses Verhalten ist aufgrund von der Art der Datentypen decimal und numeric und die Kürzung, die als Ergebnis der Genauigkeit und die Skalenwerte auftritt. Laut ist SQL Server-Onlinedokumentation das Ergebnis von sum(numeric(p,s)) numeric(38,s). In der vorangehenden Fall, ist sum(amount) numeric(38,9). Wenn Sie haben einen Ausdruck der numeric(38,9) / numeric(15,9); das Ergebnis ist idealerweise numeric(63,25). Da die maximale Genauigkeit 38 ist, schneidet das Ergebnis jedoch auf (38,6).

Abhilfe

Verwenden Sie eines dieser Methoden, um dieses Verhalten zu umgehen:
  • Verwenden Sie einen numerischen als Divisor. Beispiel:

    DECLARE @Quantity numeric(15,9)
    SET @Quantity = 3
    
    SELECT Round(CAST(Sum(t1.Amount) AS numeric(15,9))/@Quantity, 9) As Cost
    FROM t1
    
    					
  • Speichern Sie die Summe in einer Variablen, und verwenden Sie die Variable in der Formel. Beispiel:

    
    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
    
    					
  • Legen Sie einen expliziten Wert in Nenner. Zum Beispiel:
    select sum(Amount)/3 from t1
    					

Weitere Informationen

Führen Sie zum Reproduzieren des Verhaltens von Query Analyzer die folgende Abfrage:
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
				
Again, die Skalierung und Genauigkeit im Ergebnis korrekt sind.

Jedoch, wenn Sie diesen Code

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

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

Verlust der Genauigkeit tritt nicht auf, wenn Sie einen expliziten Wert im Nenner angeben. Verlust an Genauigkeit tritt nicht auf, wenn Sie in den Wert der Summe einfügen:

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

				
kein Genauigkeitsverlust auftritt, wenn Sie SUM(amount) in einer Variablen speichern und Sie dann die Variable verwenden. Verlust der Genauigkeit tritt nur auf, wenn Sie das aggregate Schlüsselwort SUM oder AVG in einer mathematischen Formel mit Division verwenden.
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
				

Eigenschaften

Artikel-ID: 281341 - Geändert am: Donnerstag, 16. Oktober 2003 - Version: 3.2
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft SQL Server 7.0 Standard Edition
  • Microsoft SQL Server 2000 Standard Edition
Keywords: 
kbmt kbprb KB281341 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 281341
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

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