PRB: Ztráta přesnosti může vyskytnout při použití funkce AVG nebo SUMA V vzorec s oddělení

Překlady článku Překlady článku
ID článku: 281341 - Produkty, které se vztahují k tomuto článku.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Příznaky

Při použití agregační funkce SUM nebo AVG s dělení výsledek ztratí přesnost. Ztráta přesnosti dochází bez ohledu na to, zda použít desítkové nebo číselný datový typ.

Příčina

Toto chování je způsobeno charakteru desítkové a číselné datové typy a zkrácení dochází v důsledku přesnost a měřítko hodnoty. Podle SQL Server Books Online je výsledek sum(numeric(p,s)) numeric(38,s). V předchozím případě je sum(amount) numeric(38,9). Když máte výraz numeric(38,9) / numeric(15,9); ideálním případě by výsledkem je numeric(63,25). Však protože maximální přesnost je 38, výsledek zkrátí k (38,6).

Jak potíže obejít

Toto chování obejít, použijte některou z těchto metod:
  • Použít číselnou jako dělitel. Například:

    DECLARE @Quantity numeric(15,9)
    SET @Quantity = 3
    
    SELECT Round(CAST(Sum(t1.Amount) AS numeric(15,9))/@Quantity, 9) As Cost
    FROM t1
    
    					
  • Nejprve uložte součet v proměnné a ve vzorci použít proměnné. Například:

    
    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
    
    					
  • Vložte jmenovatel explicitní hodnota. Například:
    select sum(Amount)/3 from t1
    					

Další informace

Pro reprodukci chování spustit z Query Analyzer následující dotaz:
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, měřítko a přesnost jsou správný výsledek.

Však Pokud použijete tento kód

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

SELECT Sum(t1.Amount)/@Quantity As Cost<BR/>
FROM t1
				
výsledek je.666666.

Ztráta přesnosti nenastane, pokud poskytují explicitní hodnotou jmenovatele. Ztráta přesnosti nenastane, pokud umístíte hodnotu Součet:

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

				
bez ztráty přesnost dochází, pokud uložit SUM(amount) v proměnné a potom použít proměnnou. Ztráta přesnosti dochází pouze při použití agregační klíčové SUM nebo AVG v matematický vzorec s dělení.
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
				

Vlastnosti

ID článku: 281341 - Poslední aktualizace: 16. října 2003 - Revize: 3.2
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft SQL Server 7.0 Standard Edition
  • Microsoft SQL Server 2000 Standard Edition
Klíčová slova: 
kbmt kbprb KB281341 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:281341

Dejte nám zpětnou vazbu

 

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