2010-11-18 4 views
8

Ho scritto un sistema di paging per sql server. e funziona benissimo, ma sto cercando di tornare quante pagine ci sono in totaleArrotondare in SQL Server?

Quindi se ci sono 5 i record e 2 record per pagina, allora il totale è di 3 pagine

questo è quello che ho

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

e la mia uscita parametro è definito in questo modo

@TotalPages AS INT OUT, 

Ora sorta di opera :-) nel mio test ci sono 5 i record e 2 record per pagina in modo che il sopra di selezione ret urna 2 ma è sbagliato dovrebbe essere 3

Questo perché il suo detto 5/2 = numero intero 2 ... come posso arrotondare ...?

ho soffitto stanco, ma non poteva farlo funzionare ..

Tutte le idee?

Grazie in anticipo

risposta

12

Hai provato Casting sia il numeratore e il denominatore come galleggiante e quindi utilizzando Cieling?

Le operazioni integer danno sempre numeri interi. Prova il seguente:

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

Grazie! ha funzionato benissimo – Martin

2

La matematica intera non viene arrotondata, viene troncata. Modificare @RecsPerPage in modo che sia mobile anziché int, quindi utilizzare ceil nell'istruzione sql.

0

Prova

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

SQL Server darà sempre un risultato intero quando si divide due numeri interi.

È possibile aggiungere un ".0" alla fine dei valori effettivi hardcoded o moltiplicare per "1.0" per convertire un valore di campo. Se vuoi arrotondare, il modo migliore che conosco è aggiungere 0,5, quindi chiamare la normale funzione ROUND. Funziona perché ROUND_DOWN (numero + .5) è sempre uguale a ROUND_UP (numero).

È anche possibile eseguire manualmente il cast di un campo su un oggetto mobile, come altri hanno sottolineato.

Ma notare che

round(1.0/2.0,0) 

restituirà un floating point risultato , considerando

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

darà un numero intero risultato. Quindi usa quello che funziona meglio per te.

Tutti questi sono illustrati nel seguente esempio:

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 

Ecco una funzione che farà retate per voi, insieme a un SELECT per visualizzare i risultati che dà.

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

Ecco un codice simile. Le funzioni CAST mantengono SQL dall'arrotondamento automatico. Regola lo 0,00 alla precisione desiderata.

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 

modifica - arrotondamento corretto param. a 0

3

È possibile utilizzare l'aritmetica interi per questo:

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

(ho capito che la Formula molti, molti anni fa (prima che ci fosse un internet dove si poteva chiedere pensa come questo), e hanno utilizzato molte volte.)

+0

+1 per non utilizzare il cast :) –

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

Tenere la formula originale, ma è necessario controllare per vedere se il resto è> 0, e in tal caso è sufficiente aggiungere 1 al risultato.