PROBLEMA: Perda de precisão poderá ocorrer quando utiliza soma ou média funções numa fórmula com a divisão

Traduções de Artigos Traduções de Artigos
Artigo: 281341 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Sintomas

Quando utiliza a função de agregação soma ou média com divisão, o resultado perde precisão. A perda de precisão ocorre independentemente de se utilizar um tipo de dados numérico ou decimal.

Causa

Este comportamento ocorre devido à natureza dos tipos de dados decimais e numéricos e a truncagem ocorre como resultado da precisão e os valores de escala. De acordo com SQL Server Books Online, o resultado da sum(numeric(p,s)) é numeric(38,s). No caso anterior, sum(amount) é numeric(38,9). Quando tiver uma expressão de numeric(38,9) / numeric(15,9); Idealmente, o resultado é numeric(63,25). No entanto, uma vez que a precisão máxima é 38, trunca o resultado para (38,6).

Como contornar

Para contornar este comportamento, utilize um dos seguintes métodos:
  • Utilize um valor numérico como divisor. Por exemplo:

    DECLARE @Quantity numeric(15,9)
    SET @Quantity = 3
    
    SELECT Round(CAST(Sum(t1.Amount) AS numeric(15,9))/@Quantity, 9) As Cost
    FROM t1
    
    					
  • Armazenar primeiro a soma numa variável e utilizar a variável na fórmula. Por exemplo:

    
    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
    
    					
  • Colocar um valor explícito um denominador. Por exemplo:
    select sum(Amount)/3 from t1
    					

Mais Informação

Para reproduzir o comportamento, execute a consulta seguinte a partir do analisador de consultas:
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
				
voltar, a escala e precisão estão correctos no resultado.

No entanto, se utilizar este código

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

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

A perda de precisão não ocorre se fornecer um valor explícito no denominador. Perda de precisão não ocorre se colocar no valor da soma:

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

				
sem perda de precisão ocorre se armazenar SUM(amount) numa variável e, em seguida, utilize a variável. A perda de precisão só ocorre quando utiliza a palavra-agregação chave soma ou média numa fórmula matemática com divisão.
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
				

Propriedades

Artigo: 281341 - Última revisão: 16 de outubro de 2003 - Revisão: 3.2
A informação contida neste artigo aplica-se a:
  • Microsoft SQL Server 7.0 Standard Edition
  • Microsoft SQL Server 2000 Standard Edition
Palavras-chave: 
kbmt kbprb KB281341 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 281341

Submeter comentários

 

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