Округление в SQL Server?
Я написал систему подкачки для sql server. и он отлично работает, но я пытаюсь вернуть, сколько страниц всего
следовательно, если есть 5 записей и 2 записи на страницу, то общая сумма составляет 3 страницы
это я
SELECT @TotalPages = ( (SELECT COUNT(*) FROM #TempItems) / @RecsPerPage )
и мой выходной параметр определяется так
@TotalPages AS INT OUT,
теперь это работает: -) в моем тесте есть 5 записей и 2 записи на странице, поэтому вышеуказанный выбор возвращает 2, но это неправильно должно быть 3
это потому, что его высказывание 5 / 2 = целое число 2... как мне собраться?..?
Я устал потолка, но не мог заставить его работать..
какие идеи?
спасибо заранее
8 ответов
вы пытались использовать числитель и знаменатель в качестве поплавка, а затем использовать Cieling?
целочисленные операции всегда дают целые числа. Попробуйте следующее -
SELECT @TotalPages = CEILING((SELECT cast(COUNT(*) as float) FROM #TempItems) / @RecsPerPage )
для этого можно использовать целочисленную арифметику:
SELECT @TotalPages = ((SELECT COUNT(*) FROM #TempItems) + @RecsPerPage - 1) / @RecsPerPage
(Я понял эту формулу много, много лет назад (до того, как был интернет, где вы могли спросить, думает так), и использовали его много раз.)
целочисленная математика не округляется, она усекает. Изменить @RecsPerPage
быть поплавком вместо int, а затем использовать ceil
в вашей инструкции sql.
SQL Server всегда будет давать целочисленный результат при делении двух целых чисел.
вы можете добавить".0 "до конца фактических жестко закодированных значений или умножить на" 1.0 " для преобразования значения поля. Если вы хотите округлить, то лучший способ, который я знаю, - добавить 0.5, а затем вызвать нормальную круглую функцию. Это работает, потому что ROUND_DOWN(число + .5) всегда совпадает с ROUND_UP (число).
вы также можете вручную привести поле к поплавку, так как другие указали из.
но обратите внимание, что
round(1.0 / 2.0,0)
вернет с плавающей точкой результат, в то время как
round(cast(1 as float) / cast(2 as float),0)
даст целое результат. Так что используйте тот, который лучше всего подходит для вас.
все это проиллюстрировано в приведенном ниже примере:
SELECT
ROUND(5/2,0) AS INTEGER_EXAMPLE
,ROUND((5.0 / 2.0),0) AS FLOATING_POINT_EXAMPLE
,ROUND(CAST(5 AS FLOAT) / CAST(2 AS FLOAT),0) AS CASTING_EXAMPLE
,ROUND((5 * 1.0) / (2 * 1.0),0) AS CONVERTED_TO_FP_EXAMPLE
,ROUND(((1 * 1.0) / (4 * 1.0)) + (1.0 / 2.0),0) AS ROUNDED_UP_EXAMPLE
вот функция, которая будет делать облавы для вас, а также Выберите, чтобы показать вам результаты, которые он дает.
create function roundup(@n float) returns float
as
begin
--Special case: if they give a whole number, just return it
if @n = ROUND(@n,0)
return @n;
--otherwise, add half and then round it down
declare @result float = @n;
declare @half float = (1.0 / 2.0);
set @result = round(@n + @half,0);
return @result;
end
select
dbo.roundup(0.0) as example_0
,dbo.roundup(0.3) as example_pt_three
,dbo.roundup(0.5) as example_pt_five
,dbo.roundup(0.9) as example_pt_nine
вот какой-то аналогичный код. Функции CAST не позволяют SQL автоматически округлять. Отрегулируйте 0.00 до нужной вам точности.
declare @C int
declare @D int
SET @C = 5
SET @D = 2
DECLARE @Answer FLOAT
SELECT @Answer = CAST(@C as FLOAT) / CAST(@D as FLOAT)
SET @Answer = CASE WHEN @Answer - ROUND(@Answer, 0) > 0.00 THEN ROUND(@Answer, 0) + 1
ELSE ROUND(@Answer, 0) END
PRINT @Answer
edit-правильный параметр округления. для 0
DECLARE @Count int
SELECT @Count = COUNT(*) FROM #TempItems
SELECT @TotalPages = @Count / @RecsPerPage
IF @Count % @RecsPerPage > 0 SET @TotalPages = @TotalPages +1
сохраните исходную формулу, но вам нужно проверить, является ли остаток > 0, и если да, просто добавьте 1 к вашему результату.