2010-11-18 78 views
8

我已經爲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 ...我怎麼整理...?

我累了天花板,但不能得到它的工作..

任何想法?

在此先感謝

回答

12

你嘗試鑄造無論是分子和分母爲float,然後使用Cieling?

整數運算總是給整數。請嘗試以下操作 -

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

謝謝!工作很好 – Martin 2010-11-22 02:08:00

2

整數算術不輪,它會截斷。將@RecsPerPage更改爲float而不是int,然後在您的sql語句中使用ceil

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不使用演員:) – 2010-11-19 15:45:24

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

保留您的原始公式,但您需要檢查餘下是否大於0,如果是這樣,只需將1加到結果中。