2010-11-18 41 views
8

He escrito un sistema de paginación para el servidor sql. y funciona muy bien, pero estoy tratando de volver el número de páginas que hay en total¿Redondeo en SQL Server?

Por tanto, si hay 5 registros y 2 registros por página, entonces el total es de 3 páginas

esto es lo que tengo

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

y mi salida de parámetros se define como tal

@TotalPages AS INT OUT, 

Ahora es menos funciona :-) en mi prueba hay 5 registros y 2 registros por página por lo que el selecto ret anteriormente urnas 2 pero es incorrecto, debería ser 3

Esto se debe a que dice 5/2 = número entero 2 ... ¿cómo redondeo ...?

Me techo cansado pero no pudo conseguir que funcione ..

¿Alguna idea?

Gracias de antemano

Respuesta

12

¿Se intenta transmitir el numerador y el denominador como flotador y luego usando Cieling?

Las operaciones enteras siempre dan números enteros. Intente lo siguiente:

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

Gracias! funcionó muy bien – Martin

2

La matemática entera no redondea, trunca. Cambie @RecsPerPage para que sea un flotante en lugar de int, y luego use ceil en su instrucción sql.

0

Trate

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

SQL Server siempre dará un resultado entero cuando se divide dos números enteros.

Puede agregar un ".0" al final de los valores reales codificados, o multiplicar por "1.0" para convertir un valor de campo. Si desea redondear, entonces la mejor manera que conozco es agregar 0.5, luego llamar a la función ROUND normal. Eso funciona porque ROUND_DOWN (número + .5) es siempre el mismo que ROUND_UP (número).

También puede lanzar manualmente un campo a un flotador, como han señalado otros.

Pero tenga en cuenta que

round(1.0/2.0,0) 

devolverá un resultado de coma flotante, mientras que

round(cast(1 as float)/cast(2 as float),0) 

dará un número entero resultado. Entonces usa el que mejor te funcione.

Todos estos se ilustra en el siguiente ejemplo:

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 

Aquí es una función que va a hacer redadas para usted, junto con una SELECT para mostrar los resultados que da.

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

Aquí algunos códigos similares. Las funciones CAST evitan que SQL se redondee automáticamente. Ajuste el 0.00 a la precisión que desee.

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 

corregir - corregir parámetros param. a 0

3

Puede utilizar la aritmética de enteros para ello:

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

(me di cuenta de que hace fórmula muchos, muchos años (antes de que hubiera un Internet donde se puede pedir piensa así), y se han utilizado muchas veces.)

+0

+1 por no usar el molde :) –

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

Mantenga su fórmula original, pero hay que comprobar para ver si el resto es> 0, y si es así sólo tiene que añadir 1 al resultado.