Microsoft KB Archive/281341

= PRB: Loss of Precision May Occur When You Use SUM or AVG Functions In a Formula with Division =

Article ID: 281341

Article Last Modified on 10/16/2003

-

APPLIES TO


 * Microsoft SQL Server 7.0 Standard Edition
 * Microsoft SQL Server 2000 Standard Edition

-



This article was previously published under Q281341



SYMPTOMS
When you use the SUM or AVG aggregate function with division, the result loses precision. The loss of precision occurs regardless of whether you use a numeric or decimal datatype.



CAUSE
This behavior is due to the nature of decimal and numeric datatypes and the truncation that occurs as a result of the precision and the scale values. According to SQL Server Books Online, the result of sum(numeric(p,s)) is numeric(38,s). In the preceding case, sum(amount) is numeric(38,9). When you have an expression of numeric(38,9) / numeric(15,9); ideally, the result is numeric(63,25). However, because the maximum precision is 38, the result truncates to (38,6).



WORKAROUND
To work around this behavior, use either of these methods:   Use a numeric as the divisor. For example:

DECLARE @Quantity numeric(15,9) SET @Quantity = 3

SELECT Round(CAST(Sum(t1.Amount) AS numeric(15,9))/@Quantity, 9) As Cost FROM t1

  Store the sum in a variable first, and use the variable in the formula. For example:

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

  Put an explicit value in a denominator. For example: select sum(Amount)/3 from t1                   



MORE INFORMATION
To reproduce the behavior, run the following query from 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 Again, the scale and precision are correct in the result.

However, if you use this code DECLARE @Quantity numeric(15,9) SET @Quantity = 3

SELECT Sum(t1.Amount)/@Quantity As Cost FROM t1 the result is .666666.

The loss of precision does not occur if you provide an explicit value in the denominator. Loss of precision does not occur if you put in the value of the sum: select sum(Amount)/3 from t1 GO select 2.0000000/@quantity

No loss of precision occurs if you store SUM(amount) in a variable and you then use the variable. The loss of precision only occurs when you use the aggregate keyword SUM or AVG in a mathematical formula with division. 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

Additional query words: precision SUM AVG truncation division

Keywords: kbprb KB281341

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.