Проблема: Потери точность может произойти при использовании функции SUM или AVG функции В формулу с раздела

Переводы статьи Переводы статьи
Код статьи: 281341 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

Проблема

При использовании статистической функции SUM или AVG деления результат потере точности. Независимо от того, используется ли числового или десятичного типа данных происходит потеря точности.

Причина

Это связано с природой десятичных и числовых типов данных и усечение, которая возникает в результате выполнения точность и масштаб значения. Согласно документации SQL Server в результате sum(numeric(p,s)) является numeric(38,s). В предыдущем случае sum(amount) является numeric(38,9). При наличии выражения numeric(38,9) / numeric(15,9); в идеальном случае получается numeric(63,25). Тем не менее поскольку максимальной точностью 38, результат усекается (38,6).

Временное решение

Для временного решения этой проблемы используйте один из этих методов.
  • Используйте цифровую делитель. Например,:

    DECLARE @Quantity numeric(15,9)
    SET @Quantity = 3
    
    SELECT Round(CAST(Sum(t1.Amount) AS numeric(15,9))/@Quantity, 9) As Cost
    FROM t1
    
    					
  • Сначала сохранить сумму в переменной и использовать в формуле. Например,:

    
    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
    
    					
  • Вставьте явное значение в качестве знаменателя. Например,:
    select sum(Amount)/3 from t1
    					

Дополнительная информация

Для воспроизведения поведения, запустите следующий запрос с помощью анализатора запросов:
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
				
Опять же масштаб и точность верны в результат.

Тем не менее если используется этот код

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

SELECT Sum(t1.Amount)/@Quantity As Cost<BR/>
FROM t1
				
в результате получается.666666.

Потеря точности не происходит, если предоставить явное значение в качестве знаменателя. Потеря точности не возникает, если поместить в значение суммы.

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

				
Если сохранить SUM(amount) в переменной и затем использовать эту переменную не происходит потеря точности. Потеря точности происходит только при использовании статистической ключевое слово SUM или AVG в математической формулой деления.
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
				

Свойства

Код статьи: 281341 - Последний отзыв: 21 ноября 2010 г. - Revision: 3.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft SQL Server 7.0 Standard Edition
  • Microsoft SQL Server 2000 Standard Edition
Ключевые слова: 
kbprb kbmt KB281341 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:281341

Отправить отзыв

 

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