함수 #2
2010/05/19
--각 사원의 근무 기간을 출력해보자.
--출력결과> 사원번호, 입사일자, 근속기간
SELECT employee_id
, hire_date
, FLOOR(MONTHS_BETWEEN(SYSDATE, hire_date)/12) AS 년
, FLOOR(MOD(months_between(SYSDATE, hire_date), 12)) AS 월
FROM employees
--각 사원의 입사 분기를 알아보자
SELECT TO_CHAR(hire_date, 'Q')
, COUNT(*)
FROM employees
GROUP BY TO_CHAR(hire_date, 'Q')
-- 오늘과 2007년 1월 1일간의 개월 수는?
SELECT months_between(SYSDATE, to_date('2007-01-01', 'YYYY-MM-DD'))
FROM dual;
-- 오늘 날짜에 1년을 더해보자.
SELECT ADD_MONTHS(SYSDATE, 12) FROM DUAL;
SELECT SYSDATE +TO_YMINTERVAL('01-00') FROM dual;
-- NULL 과의 연산
-- NULL 과 연산 X --> NVL 함수사용하여 대체
SELECT NULL + 1
FROM dual;
-- 직원들의 예상 월급을 구해보자
-- 출력결과> 사원번호, 이름, 월급, 커미션퍼센트, 예상월급(월급+월급X커미션퍼센트)
SELECT employee_id
, last_name
, salary
, commission_pct
, salary + salary * NVL(commission_pct, 0) AS 예상월급
FROM employees
--DECODE 보다는 CASE 사용
--CASE 두가지로 표현
-- 모든 사원에 대항 부서번호가 60이면 'IT', 80이면 'Sales', 나머지는 'Other'로
-- 나타내 보세요
-- 출력결과> 사원번호, 이름, 부서번호, 부서이름
SELECT employee_id
, last_name
, department_id
, DECODE(department_id, 60, 'IT' , 80, 'Sales' , 'Other')
FROM employees
SELECT employee_id
, last_name
, department_id
, CASE department_id
WHEN 60 THEN 'IT'
WHEN 80 THEN 'Sales'
ELSE 'Other'
END
FROM employees
--CASE 만 가능한 비교
--사원들의 월급에 등급을 매겨보자
--평균월급(6462) 보다 적으면 L, 많으면 H
--출력결과> 사원번호, 월급, 등급
SELECT employee_id
, salary
, CASE WHEN salary < 6462 THEN 'L'
WHEN salary > 6462 THEN 'H'
ELSE 'etc'
END AS rnk
FROM employees
-- 등급: 월급이 20000 이상이면 A, 15000이상 20000미만 이면 B,
-- 10000이상 15000미만이면 C, 5000이상 10000미만이면 D
-- 이외는 E
SELECT employee_id
, salary
, CASE WHEN salary >= 20000 THEN 'A'
WHEN salary >= 15000 THEN 'B'
WHEN salary >= 10000 THEN 'C'
WHEN salary >= 5000 THEN 'D'
ELSE 'E'
END AS 월급등급
FROM employees