2013-10-28 1 views
1

나는 하나의 통화에서 여러 다른 통화로 변환 될 가격을 가지고 있지만 일단 변환되면 특정 숫자로 반올림하고 싶습니다. 나는 라운딩 필요에특정 숫자로 반올림 ex : 4, 5, 9, 0 sql

의 예는 다음과 같습니다

아무것도 다음 숫자로 라운드 10에서. 이를 위해 필자는 CEILING 기능 만 사용할 수 있습니다. 10-14 사이의 값은 14.00으로 반올림해야합니다. 예 : 12.78 ~ 14.00 14.01 ~ 15 사이는 15.00으로 반올림해야합니다. 예 : 14.25에서 15.00 15.01에서 19 사이의 값은 19.00으로 반올림해야합니다. 예 : 17.35에서 19.00 19.01에서 20 사이의 값은 20.00으로 반올림해야합니다. 예 : 19.25 ~ 20.00

나는 약간 이상하게 보이지만 내 프로젝트에 주어진 사양이다. 다음 5의 배수로 반올림하기 위해 나는 또한 이해하지만, 실제로 나를 뒤적 거리는 것은 4와 9의 가치이다.

이 숫자를 얻으려면 어떤 공식을 사용해야합니까? 아니면 숫자를 폭발시키는 것이 더 쉬울 것이며, 소수점 앞에있는 값을 잡고 위에서 언급 한 기준에 따라 대소 문자를 구합니까?

도움 주셔서 감사합니다.

+0

마지막 사례가 20입니까, 아니면 규칙이 99까지 올라가나요? – mbeckish

+0

[modulo] (http://technet.microsoft.com/en-us/library/ms190279.aspx)를 사용하여 5의 배수 중 1에 해당하는 숫자를 식별 할 수 있습니다. 그런 다음 x가 2 인 경우 - x mod 5 <= 4 및 x mod 5> 4 – mbeckish

+0

20이 마지막 사례는 아니므로 99까지 올라갑니다. 가능한 모든 경우를 다룰 수 있어야합니다. – bryankerk

답변

3

경우를 가장 이해가 보인다하지만 "반올림"논리는 좀 이상 보일 수 있습니다 :

CASE 
WHEN value < 10 THEN CEILING(value) 
WHEN value <= 14 THEN 14 
WHEN value <= 15 THEN 15 
WHEN value <= 19 THEN 19 
WHEN value <= 20 THEN 20 
END 

아니면 (%) 연산자를 int들에 float의 변환 및 계수를 사용할 수 있습니다 : 당신이 약간 이상한 요구 사항을 (모든 경우를 커버하는 간단한 공식은 없다) 가지고 있기 때문에

CASE 
WHEN value < 10 THEN CONVERT(int,CEILING(value)) 
WHEN CONVERT(int,CEILING(value)) % 5 = 0 -- 9.01 - 10, 14.01 - 15, 19.01 - 20, etc. 
    THEN CONVERT(int,CEILING(value)) 
WHEN CONVERT(int,CEILING(value)) % 5 <= 4 -- 10.01 - 14, 15.01 - 19, etc. 
    THEN CONVERT(int,FLOOR(value/5)) * 5 + 4 
END 
+0

빠른 답변 감사합니다. 위대한 작품! – bryankerk

+0

계수 항목에 +1; 정말 우아합니다. :-) –

3

, 그럼 난 당신의 최선의이 같은 CASE...WHEN 문을 사용하는 것입니다 생각합니다. 분명히 요구 사항에 따라 정확한 불평등을 조정할 :

SELECT CASE WHEN colVal < 10 THEN CEILING(colVal) 
      WHEN colVal <= 14 THEN 14 
      WHEN colVal <= 15 THEN 15 
      WHEN colVal <= 19 THEN 19 
      WHEN colVal <= 20 THEN 20 
      ELSE someotherval 
     END 

편집 : 정화 된 요구 사항에 따라, 모듈로 물건 D 스탠리의 대답은 더 잘 맞는 것입니다.

관련 문제