본문 바로가기

Oracle DataBase/SQL

문제2 (function)

 


< 문제 (FUNCTION) >

--(1) EMP Table에서 이름, 급여, 커미션 금액, 총액(sal+comm)을 구하여 총액이
--    많은 순서로 출력하라. 단, 커미션이 NULL인 사람은 제외한다.

 

select ename 이름,sal 급여,comm "커미션 금액",sal+nvl(comm,0) 총액
from emp
where comm is not null
order by 4 desc;


 

--(2) 10번 부서의 모든 사람들에게 급여의 13%를 보너스로 지불하기로 하였다.
--    이름, 급여, 보너스 금액, 부서 번호를 출력하라.

 

select ename 이름,sal 급여,(sal*0.13) "보너스 금액",deptno "부서 번호"
from emp
where deptno = 10;

 


 

--(3) 30번 부서의 연봉을 계산하여 이름, 부서번호, 급여, 연봉을 출력하라.
--    단, 연말에 급여의 150%를 보너스로 지급한다.

 

select ename 이름, deptno 부서번호,sal 급여,((sal*12)+nvl(comm,0)+(sal*1.5)) 연봉
from emp where deptno = 30; 

 


 

--(4) 부서 번호가 20인 부서의 시간당 임금을 계산하여 출력하라.
--    단, 1달의 근무일수는 12일이고, 1일 근무시간은 5시간이다.
--    출력양식은 이름, 급여, 시간당 임금(소수이하 1번째 자리에서 반올림)
--    을 출력하라.

 

 select ename 이름, sal 급여, round(((sal/12)/5),1) 임금
from emp where deptno = 20;
 



--(5) 급여가 $1,500 부터 $3,000 사이의 사람은 급여의 15%를 회비로 지불하기로 하였다.
--    이를 이름, 급여, 회비(-2자리에서 반올림)를 출력하라.

 

select ename 이름,sal 급여,round((sal*0.15),2) 회비
from emp where sal between 1500 and 3000;

 


 

--(6) 급여가 $2,000 이상인 모든 사람은 급여의 15%를 경조비로 내기로 하였다.
--    이름, 급여, 경조비(소수점 이하 절삭)를 출력하라.

 

select ename,sal,trunc(sal*0.15) 경조비
from emp where sal >= 2000;

 



--(7) 입사일부터 지금까지의 날짜수를 출력하라.
--    부서 번호, 이름, 입사일, 현재일, 근무일수(소수점 이하 절삭),
-- 근무년수(반올림),근무월수(30일 기준,반올림), 근무주수(반올림)를 출력하라.

 

select deptno,ename,hiredate,sysdate,trunc(sysdate-hiredate) 근무일수,
round(months_between(sysdate,hiredate)/12,0) 근무년수,
round(months_between(sysdate,hiredate)) 근무월수,
round(months_between(sysdate,hiredate)/7,0) 근무주수
from emp;

 



--(8) 모든 사원의 실수령액을 계산하여 출력하라.
--    단, 급여가 많은 순으로 이름, 급여, 실수령액을 출력하라
--    (실수령액은 급여에 대해 10%의 세금을 뺀 금액)

 

 select ename 이름,sal 급여,(sal*0.1)*12 실수령액 from emp order by 2 desc;

 

 



--(9) 입사일로부터 90일이 지난 후의 사원 이름, 입사일, 90일 후의 날, 급여를 출력하라.

 

 select ename 이름,hiredate 입사일,(hiredate+90) "90일 후의 날",sal 급여
from emp where sysdate-hiredate >= 90;

 



--(10) 입사일로부터 6개월이 지난 후의 입사일, 6개월 후의 날짜, 급여를 출력하라.

 

select to_char(add_months(hiredate,6),'dd-day') 입사일,
add_months(hiredate,6) "6개월후 날짜" from emp;

 


--(11) 입사한 달의 근무일수를 계산하여 부서번호, 이름, 입사일, 근무일수를 출력하라.

select deptno,ename,hiredate,trunc(sysdate-hiredate) 근무일수
from emp;

 


--(12) 모든 사원의 60일이 지난 후의 'MONDAY'는 몇 년, 몇 월, 몇 일 인가를 구하여
--     이름, 입사일, 'MONDAY'를 출력하라.

 

select ename,hiredate,to_char(hiredate+60,'monday')
from emp;

 


--(13) 입사일로부터 오늘까지의 일수를 구하여 이름, 입사일, 근무일수(반올림)를
--     출력하라.

 

 select ename,hiredate,round((sysdate-hiredate+1),0) 근무일수 from emp;

 



--(14) 입사일을 '1996년 5월 14일'의 형태로 이름, 입사일을 출력하라.

 

 select ename 이름,to_char(hiredate,'yyyy"년"" "mm"월" ""dd"일"') 입사일 from emp;

 


--(15) 이름의 글자수가 6자 이상인 사람의 이름을 앞에서 3자만 구하여
--     소문자로 이름만을 출력하라.

 

select lower(substr(ename,1,3)) from emp where length(ename) >= 6;
select * from emp;

 



--(16) 10번 부서 월급의 평균, 최고, 최저, 인원수를 구하여 출력하라.

select trunc(avg(sal)),max(sal),min(sal),count(*)
from emp where deptno = 10;

 


--(17) 각 부서별 급여의 평균, 최고, 최저, 인원수를 구하여 출력하라.
--     (부서번호도 출력)

 

select deptno 부서번호,trunc(avg(sal)) 평균,max(sal) 최고,min(sal) 최저,count(*) 인원 from emp
group by deptno order by 1;

 


--(18) 각 부서별 같은 업무를 하는 사람의 인원수를 구하여 부서번호, 업무명, 인원수를 출력하라.

select deptno 부서번호, job 업무명, count(*) 인원수
from emp group by deptno,job;

 


--(19) 같은 업무를 하는 사람의 수가 4명 이상인 업무와 인원수를 출력하라.

 

select job 업무,count(*)
from emp
group by job
having count(job) >= 4;

 


--(20) 각 부서별 평균 월급, 전체 월급, 최고 월급, 최저 월급을 구하여 평균 월급이
--     많은 순으로 출력하라. (부서번호도 출력)

 

select deptno 부서번호,trunc(avg(sal)) "평균 월급",sum(sal) "전체 월급",

max(sal) "최고 월급",min(sal) "최저 월급"
from emp group by deptno order by 2 desc;

 


 


 

'Oracle DataBase > SQL' 카테고리의 다른 글

5day  (0) 2012.07.10
4day  (0) 2012.07.10
3day  (0) 2012.07.05
문제1 (select)  (0) 2012.07.04
2day  (0) 2012.07.04