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

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
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
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 = 3SELECT Round(CAST(Sum(t1.Amount) AS numeric(15,9))/@Quantity, 9) As CostFROM 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 = 3declare @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)    )GOINSERT INTO t1( Amount ) VALUES (0.7)INSERT INTO t1( Amount ) VALUES (1.3)SELECT Amount FROM t1/* result (correct, scale = 9)Amount      ----------------- .7000000001.300000000DECLARE @Quantity numeric(15,9)SET @Quantity = 3    SELECT t1.Amount / @Quantity As CostFROM 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 = 3SELECT 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 t1GOselect 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 = 3declare @sum numeric (15,9)set @sum= (select sum(amount) from t1)select @sum/@quantity as cost				
divisão de truncamento de média de soma de precisão

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 281341 - Última Revisão: 12/05/2015 23:03:38 - Revisão: 3.2

Microsoft SQL Server 7.0 Standard Edition, Microsoft SQL Server 2000 Standard Edition

  • kbnosurvey kbarchive kbmt kbprb KB281341 KbMtpt
Comentários