Округление в 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

попробовать

SELECT @TotalPages = CEILING( (SELECT COUNT(*) FROM #TempItems) * 1.0/ @RecsPerPage ) 

вот какой-то аналогичный код. Функции 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 к вашему результату.