2011-12-22 16 views
5

पर ऊपर या नीचे गोल करें जैसा कि सवाल बताता है, मुझे 0-14 से संख्याओं के अपवाद के साथ निकटतम 20 तक गोल या नीचे की आवश्यकता है, सभी को 20 तक गोल होना चाहिए, क्योंकि शून्य मानों की अनुमति नहीं है। तालिका नई values.For साथ अद्यतन करने की नहीं है अब मैं केवल ऊपर और नीचे निकटतम 100 को गोलाई में कामयाब रहे या नीचे के रूप में देखी गई:निकटतम 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] 

उत्तर

5

इस प्रयास करें:

DECLARE @testValue Int = 35; 

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

वहाँ एक और अधिक हो सकता है इष्टतम दृष्टिकोण, लेकिन यह पहला समाधान था जो दिमाग में आया था। * 1.0 एक फ़्लोटिंग पॉइंट नंबर पर रूपांतरण को मजबूर करना है ताकि / 20 आंशिक परिणाम उत्पन्न करे। परिणाम ROUND का उपयोग करके गोल किया गया है और फिर अंतिम "गोलाकार" मान प्राप्त करने के लिए 20 द्वारा गुणा किया गया।

खाते में 0-14 के अपने विशेष मामले के लेने के लिए संपादित ...

+0

20.0 तक विभाजित एक फ़्लोटिंग पॉइंट नंबर को मजबूर करेगा। आपको 1.0 – cadrell0

+1

द्वारा एकाधिक की आवश्यकता नहीं है, इसलिए, यह मूल रूप से वही विचार है। लेकिन हाँ, इसे 'ईएलएसई राउंड (@testValue/20.0, 0) * 20' भी लिखा जा सकता है। यदि '20' एक चर है जो 'Int' भी है, तो आपको फिर से' * 1.0' की आवश्यकता होगी। – Yuck

+0

मुझे कोई जानकारी नहीं है कि कभी-कभी परिणाम 1 या 2 क्यों होता है (विभिन्न मूल्यों के साथ बीटीडब्ल्यू, 1 9; 2 9; 16 आदि)। लेकिन मैंने कोड को मेरे प्रश्न में वर्णित प्रारूप के साथ संशोधित किया और यह बहुत अच्छा काम किया। बहुत धन्यवाद, मैंने 1.0 के साथ गुणा करने के बारे में नहीं सोचा था। – Hari

2

यह काम करेगा:

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

उदाहरण उपयोग:

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

मैं पूर्णांक विभाजन * पसंद करते हैं जहां संभव हो, और यदि number एक पूर्णांक है, तो मेरा समाधान

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 

* एसक्यूएल सर्वर पूर्णांक विभाजन का उपयोग करता है जब दोनों ऑपरेंड पूर्णांक हैं: शायद कुछ इस तरह होगा।