sql server агрегирует значения с плавающей запятой

#sql-server-2008 #aggregation

#sql-server-2008 #агрегирование

Вопрос:

ПРИВЕТ, я получаю разные результаты при агрегировании значений с плавающей запятой. Запрос приведен ниже

 declare @cy datetime
set @d = '12/01/2010'

select SUM(total) from (
select sum(amt1) as total from table1
where date1 < @d  
union all
select sum(amt1) as total from table1
where date1 >= @d
) as a 
  

тип данных amt1 — float.

таким образом, запрос просто агрегирует итоговое значение столбца в таблице table1. Теперь, если я изменю переменную @d, скажем, на ’01/01/2010′, я получу другую сумму. я продолжаю получать разное количество для разных временных диапазонов, почему это происходит. я бы ожидал, что результаты будут одинаковыми при каждом запуске запроса, который будет соответствовать приведенному ниже запросу select sum (amt1) из table1

спасибо, Бен

обновление: я использовал объединение всех. спасибо, что указали на это. это все еще дает мне разные результаты

Комментарии:

1. я использую объединение всех (пропустил это в запросе, который я опубликовал), и все равно он возвращает разные значения

2. Это опечатка, которую вы суммируете amt1 в первом запросе и amt во втором? В противном случае вы вполне могли бы ожидать других результатов.

3. Я думаю, вы пробовали приводить свои значения с плавающей запятой к более высокой точности float(24) ?

4. И что, если вы попытаетесь привести к точному числовому типу, вы все равно получите несоответствие?

5. Ну, я думаю, мы могли бы вернуться к идее, что порядок, в котором добавляются числа, имеет значение , но это гораздо большее расхождение, чем мне удалось обнаружить при тестировании. Сколько строк задействовано? Также, какое наибольшее и наименьшее положительное число и наибольшее и наименьшее отрицательное число?

Ответ №1:

Я подозреваю, что вы используете UNION , потому что в ваших запросах на самом деле есть две разные таблицы, например, table1 и table2 . В этом случае не следует ожидать, что сумма будет одинаковой при изменении даты.

Обновление: Я только что заметил, что вы выбираете amt в одном запросе и amt1 в другом, поэтому нет причин ожидать, что суммы будут такими же, как изменения даты.

Комментарии:

1. Я думаю, что на самом деле он разбивает записи в таблице на заданную дату (т. е. все записи до и все записи после). В этом случае справедливо предположить, что будет возвращено то же самое итоговое значение.

2. правильно, я разделяю записи. я бы предположил, что это вернет мне ту же сумму, независимо от того, какой диапазон дат я даю

3. @user55474 смотрите мое обновление, вы не разделяете их, поскольку выбираете из двух разных столбцов

4. RedFilter — извините за то, что перепутал название столбца, я думаю, что написал не тот столбец. Я использую тот же столбец.