#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 — извините за то, что перепутал название столбца, я думаю, что написал не тот столбец. Я использую тот же столбец.