mssql 쿼리문 반올림을 5단위가 아닌 2.5단위로 하려면 어떻게 해야 할까요? 0 8 1,544

by 훈미남 [SQL Query] MSSQL [2018.06.01 12:56:03]


안녕하세요.

저의 실력이 미천하여 고수님께 질문을 드려 답을 구하고자 합니다.
도와 주시면 감사하겠습니다.

꾸벅~!

 

DB : MS SQL 2014
테이블 : A
컬럼   : JUMSU


ms sql 에서 반올림(round)하면 5 이상이면 올리고 5 미만이면 버리잖아요.
그런데 제가 하고 싶은건 2.5 기준과 5  그리고 7.5 기준으로 결과를 얻고 싶습니다.

끝자리가 0~2 이면 버려서 0이 되고
끝자리가 3~5 이면 올려서 5가 되고
끝자리가 6~7 이면 버려서 5가 되고
끝자리가 8~10 이면 올려서 10 이 되는 결과를 얻고 싶은거죠.

 

★ 그런데 
기준값은 백단위인 3자리수와 ( 예, 736  927  136 등) 
기준값은 천단위인 4자리수가 있습니다. ( 예, 3736  1927  5136 등) 


★ 먼저 백단위 일 경우
|-----------------|----------------|----------------|----------------|
0                 2.5                 5                 7.5               10

끝자리가 0~2 이면 0이 되고
끝자리가 3~5 이면 5가 되고
끝자리가 6~7 이면 5가 되고
끝자리가 8~10 이면 10 이 되는 결과를 얻고 싶습니다.

기준값-> 결과값 
700   -> 700
722   -> 720
825   -> 825
827   -> 825
384   -> 385
428   -> 430
999   -> 1000
724   -> 725


★ 두번째로 천단위 일 경우

|-----------------|----------------|----------------|----------------|
0                  25                50                75               100

끝에 두 자리가 0~24 이면 0이 되고
끝에 두 자리가 25~50 이면 50 이 되고
끝에 두 자리가 51~74 이면 50 이 되고
끝에 두 자리가 75~100 이면 100 이 되는 결과를 얻고 싶습니다.

기준값-> 결과값 
4500 -> 4500
5826 -> 5850
8874 -> 8850
7017 -> 7000
3734 -> 3750
9978 -> 10000

위의 결과를 얻을 수 있는 SQL 쿼리문 어떻게 해야 할지요?
 

by 마농 [2018.06.01 13:53:42]

1. 한테이블에 3자리와 4자리가 공존해서. 두가지 기준을 한 쿼리로 적용해야 하는 건가요?
2. 3자리, 4자리 테이블 따로 있어서. 쿼리도 따로 만들어야 하는 건가요?


by 훈미남 [2018.06.01 14:26:19]

1. 한 테이블(A)의 한개의 컬럼(JUMSU)에 3자리 4자리 5자리 6자리까지 공존합니다.

   우선 두가지 기준(3자리와 4자리)을 한 쿼리로 적용하고 싶습니다.

   이게 되면 5자리 6자리는 제가 응용해보려고 했습니다.

   혹시 어려우면 3자리와 4자리 각각 2개의 쿼리로 만들어서 두 번 돌리면 됩니다.


by 마농 [2018.06.01 14:38:59]
WITH t AS
(
SELECT 700 jumsu
UNION ALL SELECT   722
UNION ALL SELECT   825
UNION ALL SELECT   827
UNION ALL SELECT   384
UNION ALL SELECT   428
UNION ALL SELECT   999
UNION ALL SELECT   724
UNION ALL SELECT  4500
UNION ALL SELECT  5826
UNION ALL SELECT  8874
UNION ALL SELECT  7017
UNION ALL SELECT  3734
UNION ALL SELECT  9978
UNION ALL SELECT 45001
UNION ALL SELECT 58262
UNION ALL SELECT 88743
UNION ALL SELECT 70174
UNION ALL SELECT 37345
UNION ALL SELECT 99786
)
SELECT jumsu
     , CAST(ROUND(jumsu / x, 0) * x AS INT) x
  FROM (SELECT jumsu
             , (5. * POWER(10, LEN(jumsu) - 3)) x
          FROM t
        ) a
;

 


by 훈미남 [2018.06.01 15:04:33]

마농님. 답변 감사합니다.

위의 쿼리문 결과 나오는것을 확인하였습니다.

죄송하지만, 제가 실력이 미천하여 WITH t AS 예시 숫자를 걷어내고 A테이블 jumsu 컬럼명만 써서 정리 한 번 해주실 수 있을까요?


by 마농 [2018.06.01 15:11:45]

with 직접 걷어내시면 됩니다.


by 훈미남 [2018.06.01 15:36:13]

걷어냈는데 0으로 나누기 오류가 발생했습니다.

컬럼 jumsu 자리수가 2자리 1자리가 있어서 발생한것으로 where jumsu >= 100 조건을 추가하여 해결하였습니다.

귀한 시간 내어주셔서 감사 드립니다.


by 마농 [2018.06.01 15:41:33]

2자리 1자리는 그냥 제외하면 되는건가요?
아니면 2자리 1자리도 나와야 하나요?


by 훈미남 [2018.06.01 15:45:53]

2자리와 1자리는 제외합니다. 100 부터 적용됩니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입