2011-12-22 42 views
5

Khi câu hỏi gợi ý, tôi cần làm tròn lên hoặc xuống gần 20, ngoại trừ các số từ 0-14, tất cả phải tròn đến 20, vì không có giá trị bằng 0 nào được cho phép. bảng đã không được cập nhật với values.For mới bây giờ tôi đã được quản lý chỉ làm tròn lên hoặc xuống để gần nhất 100 như bên dưới:Làm tròn lên hoặc xuống đến gần nhất 20

CASE WHEN ROUND(number,-2)=0 THEN CAST(ROUND(number,-2)+100 AS DECIMAL(18, 0)) 
     ELSE CAST(ROUND(number,-2) AS DECIMAL(18,0)) END AS [NUMBER] 

Trả lời

5

Hãy thử điều này:

DECLARE @testValue Int = 35; 

SELECT 
    CASE 
    WHEN @testValue BETWEEN 0 AND 14 THEN 20 
    ELSE ROUND((@testValue * 1.0)/20, 0) * 20 
    END MyRoundedValue; 

có thể có một hơn cách tiếp cận tối ưu, nhưng đây là giải pháp đầu tiên xuất hiện trong đầu. * 1.0 là bắt buộc chuyển đổi sang một số dấu phẩy động sao cho số / 20 sẽ tạo ra các kết quả phân đoạn. Kết quả được làm tròn bằng cách sử dụng ROUND sau đó nhân với 20 để nhận giá trị "làm tròn" cuối cùng của bạn.

Edited để có trường hợp đặc biệt của bạn của 0-14 vào tài khoản ...

+0

Chia cho 20.0 sẽ buộc một số dấu phẩy động. Bạn không cần phải nhiều bởi 1.0 – cadrell0

+1

Vì vậy, về cơ bản nó là cùng một ý tưởng. Nhưng có, nó cũng có thể được viết 'ELSE ROUND (@testValue/20.0, 0) * 20'. Nếu '20' là một biến mà còn' Int' bạn sẽ yêu cầu '* 1.0' một lần nữa. – Yuck

+0

Tôi không có bất kỳ ý tưởng tại sao đôi khi kết quả là 1 hoặc 2 (với các giá trị khác nhau btw, 19; 29; 16 vv). nhưng tôi đã sửa đổi mã với định dạng được mô tả trong câu hỏi của tôi và nó hoạt động rất tốt. Cảm ơn rất nhiều, tôi không nghĩ đến việc nhân với 1.0. – Hari

2

này sẽ làm việc:

--N = Your nearest number 
--X = Number to round 
SELECT ROUND(X/N, 0) * N 

Ví dụ Cách sử dụng:

DECLARE @numberToRound INT; 
SET @numberToRound = 25; 

CASE WHEN @numberToRound BETWEEN 0 AND 14 THEN 
    20 
ELSE 
    ROUND((CAST(@numberToRound AS DECIMAL)/20.00), 0) * 20 
END 
0

tôi thích nguyên bộ phận * nếu có thể và nếu number là số nguyên, giải pháp của tôi có lẽ sẽ là một cái gì đó như thế này:

CASE 
    WHEN number BETWEEN 0 AND 14 THEN 20 /* actually, it seems to make more sense 
              to have the range as BETWEEN 0 AND 9, 
              because values from 10 to 14 would be 
              converted to 20 with the ELSE branch 
              anyway */ 
    ELSE (number + 10)/20 * 20 
END 

* SQL Server sử dụng phân chia số nguyên khi cả hai toán hạng là số nguyên.

Các vấn đề liên quan