본문 바로가기
DB/SQL(오라클)

오라클(SQL)숫자형 함수(mod, remainder, CEIL(N), FLOOR(N), WIDTH_BUCKET)

by redbear0077 2021. 3. 12.
반응형

숫자형 함수(mod,  remainder, CEIL(N),  FLOOR(N), WIDTH_BUCKET)

테이블 다운로드

 

mod, remainder
    -나머지 값을 반환
    1)mod(c,o)
        .주어진 수C를 N으로 나눈 나머지 반환
        .JAVA언어의 %연산자와 같은 기능
사용예) 2000년 2월 23일이 무슨 요일인지 구하시오.

--SELECT CASE MOD((TO_DATE('20000223') - TO_DATE('00010101')-1),7)
SELECT CASE MOD((TRUNC(SYSDATE) - TO_DATE('00010101')-1),7)
            WHEN 1 THEN '월요일'
            WHEN 2 THEN '화요일'
            WHEN 3 THEN '수요일'
            WHEN 4 THEN '목요일'
            WHEN 5 THEN '금요일'
            WHEN 6 THEN '토요일'
            ELSE '일요일' END AS 요일
        TRUNC(SYSDATE)-TO_DATE('00010101')-1 AS 일수
  FROM DUAL;

REMAINDER(C,N)
        .C를 N으로 나눈 나머지 반환
        .내부적으로 MOD와 다른 방법으로 처리하여 다른 결과 반환
        .MOD : 나머지 = C - N*FLOOR(C/N)
         REMAINGER : 나머지 = C - N*ROUND(C/N)
    
예)13/5의 나머지

    1)MOD : 13 - 5*FLOOR(13/5)
            13 - 5*FLOOR(2.6)
            13 - 5*2 => 3
    2)REMAINDER
            13 -5*ROUND(13/5)
            13 -5*ROUND(2.6)
            13 -5*3 => 1

예)11/5의 나머지

    1)MOD : 11 - 5*FLOOR(11/5)
            11 - 5*FLOOR(2.2)
            11 - 5*2 => 1
    2)REMAINDER
            11 -5*ROUND(11/5)
            11 -5*ROUND(2.2)
            11 -5*3 => 1
            
SELECT MOD(11,5),REMAINDER(11,5) FROM DUAL;

CEIL(N), FLOOR(N)
    -주어진 수 N에 가장 근접한 정수를 반환
    -CEIL은 N과 같거나 큰 수 중 가장 작은 정수
    -FLOOR는 N과 같거나 작은 수 중 가장 큰 정수
    EX) CEIL(23.56) -> 24, CEIL(-23.56) -> -23
        FLOOR(23.56) -> 23, FLOOR(-23.56) -> -24

 

WIDTH_BUCKET
    -주어진 최소값과, 최대값을 몇개의 그룹으로 나누고 제시된 값이 어느 그룹에 속하는 지를 반환

(사용형식)

 WIDTH_BUCKET(C,MIN,MAX,B)
    .C : 주어진 수
    .MIN : 구간의 하한 값
    .MAX : 구간의 상한 값
    .B : 구간의 수

사용예) 사원테이블에서 사원의 급여에 따른 등급을 구하여 출력하시오
        급여를 2000부터 20000까지 9개 등급으로 나누고 급여가
        많은 사원이 작은 등급을 부여받도록 하시오
        ALIAS는 사원번호, 사원명, 급여, 등급

SELECT EMPLOYEE_ID AS 사원번호,
       EMP_NAME AS 사원명,
       SALARY AS 급여,
--       11-WIDTH_BUCKET(SALARY,2000,20000,9)||'등급' AS 등급
       WIDTH_BUCKET(SALARY,20000,2000,9)||'등급' AS 등급       
  FROM EMPLOYEES;

예)회원테이블에서 회원들의 ㅏ일리지를 기준으로 증급을 구하고 등급이 1~1등급
   회원은 'VIP회원', 3~5등급 회원은 '일반회원', 그 이하 회원은 '준회원'
   이라는 문자열을 비고난에 출력하시오 단, 구간은 마일리지 값을 500에서
   8000까지8개 구간으로 나누고 마일리지가 많은 회원의 등급이 작은 값을
   나타내도록 한다.
   ALIAS 는 회원번호, 회원명, 마일리지, 등급, 비고

SELECT MEM_ID AS 회원번호,
       MEM_NAME AS 회원명,
       MEM_MILEAGE AS 마일리지,
       WIDTH_BUCKET(MEM_MILEAGE, 8000,500,8)AS 등급,
       CASE WHEN WIDTH_BUCKET(MEM_MILEAGE, 8000,500,8)BETWEEN
                 0 AND 2 THEN 'VIP회원'
            WHEN WIDTH_BUCKET(MEM_MILEAGE, 8000,500,8)BETWEEN
                 3 AND 5 THEN '일반회원'
            ELSE '준회원' END AS 비고
  FROM MEMBER;
반응형