2010-11-18 33 views
8

J'ai écrit un système de pagination pour le serveur sql. et il fonctionne très bien, mais je suis en train de revenir combien de pages il y a au totalArrondir dans SQL Server?

Par conséquent, s'il y a 5 enregistrements et 2 enregistrements par page, puis le total est de 3 pages

ce que j'ai

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

et mon paramètre de sortie est défini comme si

@TotalPages AS INT OUT, 

maintenant, il fonctionne en quelque sorte :-) dans mon test il y a 5 dossiers et 2 enregistrements par page que ce qui précède sélectionnez ret urnes 2 mais son tort, il devrait être 3

C'est parce que son disant 5/2 = nombre entier 2 ... comment arrondir ...?

Je plafond fatigué mais n'a pas pu le faire fonctionner ..

Toutes les idées?

Merci à l'avance

Répondre

12

Avez-vous essayé de coulée soit le numérateur et le dénominateur flottant, puis en utilisant cieling?

Les opérations entières donnent toujours des entiers. Essayez ce qui suit -

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

Merci! a bien fonctionné – Martin

2

Les nombres entiers ne sont pas arrondis, ils sont tronqués. Remplacez @RecsPerPage par float au lieu de int, puis utilisez ceil dans votre instruction sql.

0

Essayez

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

SQL Server toujours donner un résultat entier quand on divise deux entiers.

Vous pouvez ajouter un ".0" à la fin des valeurs réelles codées en dur, ou multiplier par "1.0" pour convertir une valeur de champ. Si vous voulez arrondir, alors la meilleure façon que je connaisse est d'ajouter 0,5, puis appelez la fonction RONDE normale. Cela fonctionne parce que ROUND_DOWN (nombre + .5) est toujours le même que ROUND_UP (nombre).

Vous pouvez également lancer un champ manuellement sur un flotteur, comme d'autres l'ont indiqué.

Mais notez que

round(1.0/2.0,0) 

renverra un résultat virgule flottante, alors que

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

donnera un entier résultat. Alors, utilisez celui qui vous convient le mieux.

Tous ces éléments sont illustrés dans l'exemple ci-dessous:

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 

Voici une fonction qui fera pour vous rafles, avec un SELECT pour vous montrer les résultats qu'il donne.

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

Voici un code similaire. Les fonctions CAST conservent SQL d'arrondi automatique. Ajustez le 0.00 à la précision que vous voulez.

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 

éditer - corriger arrondi param. à 0

3

Vous pouvez utiliser Arithmétique entier pour que:

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

(je compris qu'il ya formule de nombreuses années (avant qu'il y ait un Internet où l'on pouvait demander pense comme ça), et ont utilisé plusieurs fois.)

+0

+1 pour ne pas utiliser de casting :) –

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

Gardez votre formule originale, mais vous devez vérifier pour voir si le reste est> 0, et si oui, il suffit d'ajouter 1 à votre résultat.