숫자 함수

서현서현·2022년 2월 15일
0

DB, SQL

목록 보기
10/27
post-thumbnail

🍎 함수

🍎 숫자함수

🍎 1) 수학적 함수

  • 삼각함수, 지수함수등을 제공
  • ABS(n) : n의 절댓값 반환
  • SIGN(n) : n의 부호에 따라 음수이면 -1, 양수이면 1, 0이면 0을 반환
  • SQRT(n) : n의 평방근 값을 반환
  • POWER(e,n) : e의 n승값(e를 n번 반복 곱셉한 결과) 반환
  • 그 밖에 SIN, TAN, COS, LOG 등의 함수 사용 가능
SELECT ABS(-100),
ABS(0.00005),
SIGN(-100000),
SIGN(0),`
SIGN(0.000009),
SQRT(24),
POWER(2,10)
FROM DUAL;

🍎 2) GREATEST, LEAST

  • 최대값과 최소값 반환
(사용형식)
GREATEST(n1,n2[[,n3,...]), - 주어진 수 중 최대값 반환
LEAST(n1,n2[,n3,...]) - 주어진 수 중 최소값 반환

(EX1)

SELECT GREATEST('홍길동','김선동','홍길순');
LEAST('홍길동',57,'홍길순')
FROM DUAL;

(EX2) 회원테이블에서 회원들이 보유한 마일리지를 조사하여 1000미만의 회원들의마일리지를 999로 부여하여

Alias 회원번호,회원명,원래의마일리지. 변경마일리지

SELECT MEM_NAME
FROM MEMBER;
PRDER BY 2;

(EX3)1000보다 작으면 1000, 1000보다 크면 자기 마일리지 출력

SELECT MEM_ID
MEM_NAME
MEM_MILEAGE
MEM_GREATEST

🍎 3) ROUND TRUNC

  • 반올림과 자리버림한 결과 반환
(사용형식)
ROUND(n[,l))
	TRUNC(n,[,l])
  • 주어진 수 n을 l+1번째 자리에서 자리올림(ROUND) 또는 자리버림(TRUNC)하여 반환
  • l이 생략되면 0으로 간주
  • l이음수이면 n에서 정수부분 -l자리에서 반올림 또는 자리버림 수행

(EX1)

SELECT ROUND(765265.56089,3),
       TRUNC(765265.56089,3),
       ROUND(765265.56089),
       TRUNC(765265.56089),
       ROUND(765265.56089,-2),
       TRUNC(765265.56089,-2)
    FROM DUAL;

(EX2) 사원테이블에서 이번달 보너스를 계산한 후 이를 포함하는 지급액을 계산하시오.

보너스 = (급여*영업실적(COMMISSION_PCT))의 27%

지급액 = 급여+보너스

Alias는 사원번호, 사업명, 급여, 영업실적코드, 보너스, 지급액

단, 보너스와 지급액은 정수로 표현 (소수 펏자리에서 반올림)

COMMISION_PCT는 2자리인데 소숫점이하가 2자리니까 정수부분 없음.

SELECT EMPLOYEE_ID AS 사원번호,
  EMP_NAME AS 사원명,
  SALARY AS 급여,
  COMMISION_PCT AS 영업실적코드,
  NVL(ROUND(((SALARY*COMMISION_PCT)*0.27),0),0) AS 보너스,
  ROUND(SALARY +NVL(((SALARY*COMMISION_PCT)*0.27),0),0) AS 지급액
  FROM HR.EMPLOYEES;

왜 안돌아가ㅜ

🍎 4) MOD

  • 나머지를 반환 (자바의 ‘%’연산자와 동일 기능을 수행하는 함수)
(사용형식)
MOD(n,m)
- 주어진 수 n을 m으로 나눈 나머지 반환

(EX1)

	SELECT  MEM_NAME AS 회원명,
					MEM_BIR AS 생년월일,
					TRUNC((TRUNC(SYSDATE)-TRUNC(MEM_BIR))/7) || '주' ||
					MOD (TRUNC(SYSDATE)-TRUNC(MEM_BIR),7) || '일 경과'

		FROM MEMBER;

🍎 5) CEIL, FLOOR

  • 가장 가까운 정수를 반환
(사용형식)
CEIL(n), FLOOR(n)
- CEIL(n): n과 같거나 (n이 정수일때) 큰쪽에서 가장 가까운(제일작은)정수 반환
- FLOOR(n): n과 같거나(n이정수일때) 작은쪽에서 가장 가까운(제일 큰) 정수 반환

(EX)

SELECT CEIL(9.2345),CEIL(9),CEIL(-9.2435),
FLOOR(9.2435),FLOOR(9),FLOOR(-9.2435)
FROM DUAL;

🍎 6) REMAINDER(n,m)

  • 주어진 수 n을 m으로 나눈 나머지를 반환. 단, 나머지가 m의 절반 크기보다 크면 n을m으로 나눈 몫+1의 값이 되기 위한 n값을 원수(n)에서 뺀 값을 반환
🚨 내부에 사용되는 알고리즘이 MOD와 REMINDER가 서로 다름
  • MOD(n,m) : n - (m * FLOOR(n/m))
  • REMINDER(n,m) : n-(m*ROUND(n/m))
(사용예시)
SELECT
MOD(29.7):29-(7*FLOOR(29/7))
29-(7*FLOOR(4.143))
29-(7*4)
29-28 => 1
REMAINDER(29,7) : 29 - (7*ROUND(29/7))
29-(7*ROUND(4.143))
29-(7*4)
29-28 => 1

MOD와 REMAINDER는 둘다 나머지지만 알고리즘이 다르므로 다른값이 나온다

MOD(26,7):26-(7*FLOOR(26/7))
26-(7*FLOOR(3.714))
26-(7*3)
26-21 => 5
REMAINDER(26,7) : 26 - (7*ROUND(26/7))
26-(7*ROUND(3.714))
26-(7*4)
26-28 => -2

🍎 7) WIDTH_BUCKET(n,min,max,b)

  • 주어진 수 n이 min~max 값의 범위를 b개의 구간으로 나누었을때 몇번째 구간에 속하는지를 판간하여 구간 INDEX를 반환함.
  • n이 min보다 작으면 0번구간을 반환하고, max보다 크거나 같으면 b+1번 구간 INDEX값을 반환함

(EX1)

SELECT WIDTH_BUCKET(86,10,90,9),
			 WIDTH_BUCKET(5,10,90,9),
			 WIDTH_BUCKET(90,10,90,9)
FROM DUAL;

(EX2) 회원테이블에서 회원들의 마일리지 1000~8000점을 8개 구간으로 구분하고 각 회원들의 구간 인덱스값을 구하시오

Alias는 회원번호, 회원명, 마일리지, 등급

'등급'란에 구간 인덱스를 구하되 많은 마일리지를 보유한 회원이 작은 수의 등급을, 제일 적은 마일리지를 보유한 회원이 제일 큰 등급을 부여할것

SELECT MEM_ID AS 회원번호, 
        MEM_NAME AS 회원명, 
        MEM_MILEAGE AS 마일리지, 
        10-WIDTH_BUCKET(MEM_MILEAGE,1000,8000,8) AS 등급
FROM MEMBER;

0개의 댓글