PROBLEMA: Perda de precisão pode ocorrer ao usar funções Média ou soma em uma fórmula com divisão

Traduções deste artigo Traduções deste artigo
ID do artigo: 281341 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Sintomas

Quando você usa a função agregada Soma ou média com divisão, o resultado perde precisão. A perda de precisão ocorre independentemente de se usar um tipo de dados numérico ou decimal.

Causa

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

Como Contornar

Para contornar esse comportamento, use um desses métodos:
  • Use um numérico como o 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
    
    					
  • Primeiro, armazenar a soma em uma variável e use 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 em um denominador. Por exemplo:
    select sum(Amount)/3 from t1
    					

Mais Informações

Para reproduzir o comportamento, execute a consulta seguinte do Query Analyzer:
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
				
novamente, a escala e a precisão estão corretas no resultado.

No entanto, se você usar esse 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 você fornecer um valor explícito no denominador. Perda de precisão não ocorre se você colocar no valor da soma:

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

				
sem perda de precisão ocorre se você armazenar SUM(amount) em uma variável e você usar a variável. A perda de precisão ocorre somente quando você usa a palavra-agregada chave soma ou média em uma 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

ID do artigo: 281341 - Última revisão: quinta-feira, 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 traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes 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