2010-11-18 48 views
8

Tôi đã viết hệ thống phân trang cho máy chủ sql. và nó hoạt động tuyệt vời nhưng tôi đang cố gắng để trở lại bao nhiêu trang có trong tổngLàm tròn UP trong SQL Server?

Do đó nếu có 5 hồ sơ và 2 hồ sơ cho mỗi trang thì tổng số là 3 trang

đây là những gì tôi có

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

và đầu ra của tôi tham số được định nghĩa như vậy

@TotalPages AS INT OUT, 

Bây giờ nó loại công trình :-) trong thử nghiệm của tôi có 5 hồ sơ và 2 hồ sơ cho mỗi trang nên chọn ret trên urn 2 nhưng sai của nó phải là 3

Điều này là bởi vì nó nói 5/2 = số nguyên 2 ... làm thế nào để tôi làm tròn lên ...?

Tôi mệt mỏi trần nhưng không thể làm cho nó hoạt động ..

Bất kỳ ý tưởng nào?

Cảm ơn trước

Trả lời

12

Bạn đã thử đúc tử số và mẫu số là phao và sau đó sử dụng Cieling?

Các phép toán số nguyên luôn cung cấp số nguyên. Hãy thử các cách sau -

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

Cảm ơn! đã làm việc tuyệt vời – Martin

2

Toán nguyên không tròn, nó cắt ngắn. Thay đổi @RecsPerPage thành phao thay vì int, sau đó sử dụng ceil trong câu lệnh sql của bạn.

0

Hãy thử

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

SQL Server sẽ luôn đưa ra một kết quả số nguyên khi bạn chia hai số nguyên.

Bạn có thể thêm dấu ".0" vào cuối các giá trị được mã hóa cứng thực tế hoặc nhân với "1.0" để chuyển đổi giá trị trường. Nếu bạn muốn làm tròn, thì cách tốt nhất tôi biết là thêm 0,5, sau đó gọi hàm ROUND bình thường. Điều đó hoạt động vì ROUND_DOWN (số + .5) luôn giống như ROUND_UP (số).

Bạn cũng có thể truyền một trường vào phao theo cách thủ công, như những trường khác đã chỉ ra.

Nhưng lưu ý rằng

round(1.0/2.0,0) 

sẽ trả về một floating point kết quả, trong khi

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

sẽ đưa ra một số nguyên kết quả. Vì vậy, sử dụng một trong những công trình tốt nhất cho bạn.

Tất cả những được minh họa trong ví dụ dưới đây:

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 

Đây là một chức năng mà sẽ làm tròn-up cho bạn, cùng với một SELECT để hiển thị cho bạn những kết quả nó mang lại.

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

Đây là một số mã tương tự. Các hàm CAST giữ cho SQL không bị làm tròn tự động. Điều chỉnh 0,00 đến độ chính xác bạn muốn.

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 

chỉnh sửa - thông số làm tròn chính xác. 0

3

Bạn có thể sử dụng arithmetics nguyên cho rằng:

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

(tôi đã tìm ra rằng công thức nhiều, rất nhiều năm trước đây (trước khi có một internet, nơi bạn có thể hỏi nghĩ như thế này), và đã sử dụng nó nhiều lần.)

+0

+1 vì không sử dụng diễn viên :) –

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

Giữ nguyên công thức ban đầu, nhưng bạn cần kiểm tra xem phần còn lại là 0 và nếu chỉ cần thêm 1 vào kết quả của bạn.