2010-11-18 2 views
8

Я написал пейджинговую систему для сервера sql. и он прекрасно работает, но я пытаюсь вернуться, сколько страниц есть в общей сложностиОкругление UP в SQL Server?

Следовательно, если есть 5 записей и 2 записей на странице, то общая сумма составляет 3 страницы

это то, что я есть

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

и мой выходной параметр определяется как так

@TotalPages AS INT OUT, 

Теперь он вроде работает :-) в моем тесте есть 5 записей и 2 записей на странице так вышеприведенном выберите RET урны 2, но это неправильно, это должно быть 3

Это потому, что его высказывание 5/2 = целое число 2 ... как мне округлить ...?

Я устал потолок, но не мог заставить его работать ..

Любые идеи?

Заранее спасибо

ответ

12

Пробовали ли вы Кастинг либо числитель и знаменатель как поплавок, а затем с помощью Cieling?

Целочисленные операции всегда дают целые числа. Попробуйте следующее:

SELECT @TotalPages = CEILING((SELECT cast(COUNT(*) as float) FROM #TempItems)/@RecsPerPage) 
+0

Спасибо! отлично работал – Martin

2

Целочисленная математика не округляется, она усекает. Измените @RecsPerPage как float вместо int, а затем используйте ceil в своем заявлении sql.

0

Попробуйте

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

SQL Server всегда будет давать целочисленный результат, когда вы делите два целых числа.

Вы можете добавить «.0» в конец настоящих жестко заданных значений или умножить на «1.0», чтобы преобразовать значение поля. Если вы хотите округлить, то лучшим способом, который я знаю, является добавление 0,5, а затем вызов нормальной функции ROUND. Это работает, потому что 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 

Вот функция, которая будет делать облавы для вас, вместе с SELECT, чтобы показать вам результаты, которые она дает.

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 
0

Вот такой же код. Функции 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 

Редактировать - исправить закругление параметра. до 0

3

Вы можете использовать целую арифметику для этого:

SELECT @TotalPages = ((SELECT COUNT(*) FROM #TempItems) + @RecsPerPage - 1)/@RecsPerPage 

(я понял, что формула много, много лет назад (до того, как был интернет, где вы могли бы спросить, думает, как это), и использовал это много раз.)

+0

+1 за то, что не использовал литые :) –

0
DECLARE @Count int 
SELECT @Count = COUNT(*) FROM #TempItems 
SELECT @TotalPages = @Count/@RecsPerPage 
IF @Count % @RecsPerPage > 0 SET @TotalPages = @TotalPages +1 
0

Держите оригинальную формулу, но вы должны проверить, если остаток> 0, и если это так просто добавьте 1 к вашему результату.

Смежные вопросы