본문 바로가기
KOSTA교육/수업

[8/100] 240419

by 이원혁 2024. 4. 19.
반응형

oracle 20문항

--
--1. EMP 테이블에서 부서 인원이 4명보다 많은 부서의 부서번호, 인원수, 급여의 합을 출력하시오.
--DEPTNO   COUNT(*)   SUM(SAL)
------------ ---------- ----------
--        30          6       9400
select deptno, count(*), sum(sal)
from emp
group by deptno
having count(*) >4
;

--2.  EMP 테이블에서 가장 많은 사원이 속해있는 부서번호와 사원수를 출력하시오.
--    DEPTNO   COUNT(*)
------------ ----------
--        30          6
select deptno, count(*)
from emp
group by deptno
having count(*) = 
(select max(count(*))
from emp
group by deptno)
;

--3. EMP 테이블에서 가장 많은 사원을 갖는 MGR의 사원번호를 출력하시오.
--EMPNO
------------
--7698
select mgr as empno
from emp
group by mgr
having count(mgr) = 
(select max(count(mgr)) as mcnt
from emp
group by mgr
)
;

--4. EMP 테이블에서 부서번호가 10인 사원수와 부서번호가 30인 사원수를 각각 출력하시오.
--
--CNT10      CNT20
------------ ----------
--         3          6
select (select count(*) from emp where deptno = 10) as CNT10, (select count(*) from emp where deptno = 30) as CNT30
from dual
;

--5. EMP 테이블에서 사원번호(EMPNO)가 7521인 사원의 직업(JOB)과 같고 사원번호(EMPNO)가 7934인 사원의 급여(SAL)보다 많은 사원의 사원번호, 이름, 직업, 급여를 출력하시오.
--
--EMPNO ENAME      JOB              SAL
------------ ---------- --------- ----------
--      7499 ALLEN      SALESMAN        1600
--      7844 TURNER     SALESMAN        1500
select empno, ename, job, sal
from emp
where job = (select job from emp where empno = 7521)
and   sal > (select sal from emp where empno = 7934)
;

--6. 직업(JOB)별로 최소 급여를 받는 사원의 정보를 사원번호, 이름, 업무, 부서명을 출력하시오. 
---조건1 : 직업별로 내림차순 정렬
--
--     EMPNO ENAME      JOB       DNAME         
------------ ---------- --------- --------------
--      7521 WARD       SALESMAN  SALES         
--      7654 MARTIN     SALESMAN  SALES         
--      7839 KING       PRESIDENT ACCOUNTING    
--      7782 CLARK      MANAGER   ACCOUNTING    
--      7369 SMITH      CLERK     RESEARCH      
--      7788 SCOTT      ANALYST   RESEARCH      
--      7902 FORD       ANALYST   RESEARCH
select e.empno, e.ename, e.job, d.dname
from emp e, dept d
where e.deptno = d.deptno
group by e.empno, e.ename, e.job, d.dname
;

select min(sal)
from emp
group by job
;

--7. 각 사원 별 시급을 계산하여 부서번호, 사원이름, 시급을 출력하시오.
---조건1. 한달 근무일수는 20일, 하루 근무시간은 8시간이다.
---조건2. 시급은 소수 두 번째 자리에서 반올림한다.
---조건3. 부서별로 오름차순 정렬
---조건4. 시급이 많은 순으로 출력
--DEPTNO ENAME              시급
------------ ---------- ----------
--        10    KING         31.3
--        10    CLARK        15.3
--        20    FORD         18.8
--        20    JONES        18.6
--               ~~~ 중략 ~~~
--        30    JAMES         5.9
select deptno, ename, round((sal/160),1) as 시급
from emp
order by deptno asc, 시급 desc

;
--8. 각 사원 별 커미션(COMM)이 0 또는 NULL이고 부서위치가 ‘GO’로 끝나는 사원의 정보를 사원번호, 사원이름, 커미션, 부서번호, 부서명, 부서위치를 출력하여라. 
---조건1. 보너스가 NULL이면 0으로 출력
--
--EMPNO ENAME            COMM     DEPTNO DNAME          LOC          
------------ ---------- ---------- ---------- -------------- -------------
--      7698 BLAKE               0         30 SALES          CHICAGO      
--      7844 TURNER              0         30 SALES          CHICAGO      
--      7900 JAMES               0         30 SALES          CHICAGO
select e.empno, e.ename, nvl(e.comm,0) as comm, e.deptno, d.dname, d.loc
from emp e, dept d
where e.deptno = d.deptno and (comm = 0 or comm is null) and loc like '%GO'
;
--9. 각 부서 별 평균 급여가 2000 이상이면 초과, 그렇지 않으면 미만을 출력하시오.
--
--    DEPTNO 평균급여
------------ ----
--        30 초과  
--        20 미만  
--        10 미만
select deptno, case when avg(sal) >= 2000 then '초과' else '미만' end
from emp
group by deptno
;

--10. 각 부서 별 입사일이 가장 오래된 사원을 한 명씩 선별해 사원번호, 사원명, 부서번호, 입사일을 출력하시오.
--
--EMPNO ENAME          DEPTNO HIREDATE 
------------ ---------- ---------- ------------------------------
--      7782 CLARK              10 1981-06-09                    
--      7369 SMITH              20 1980-12-17                    
--      7499 ALLEN              30 1981-02-20
select e.empno, e.ename, m.deptno, to_char(m.hiredate, 'YYYY-MM-DD')
from emp e, (select deptno, min(hiredate) as hiredate from emp group by deptno) m
where e.deptno = m.deptno and e.hiredate = m.hiredate
order by deptno
;

--11. 1980년~1980년 사이에 입사된 각 부서별 사원수를 부서번호, 부서명, 입사1980, 입사1981, 입사1982로 출력하시오. 
--
--    DEPTNO DNAME              입사1980     입사1981     입사1982
------------ -------------- ---------- ---------- ----------
--        10 ACCOUNTING 0          2          1
--        20 RESEARCH 1          2          0
--        30 SALES 0          6          0
select e.deptno, d.dname,
count((select hiredate from emp where hiredate between '1980-01-01' and '1980-12-31'))as 입사1980,
count((select hiredate from emp where hiredate between '1981-01-01' and '1981-12-31'))as 입사1981,
count((select hiredate from emp where hiredate between '1982-01-01' and '1982-12-31'))as 입사1982
from emp e, dept d
where e.deptno = d.deptno
;

select count((select hiredate from emp where hiredate between '1980-01-01' and '1980-12-31'))
from emp
;


--12. 1981년 5월 31일 이후 입사자 중 커미션(COMM)이 NULL이거나 0인 사원의 커미션은 500으로 그렇지 않으면 기존 COMM을 출력하시오.
--
--ENAME            COMM
------------ ----------
--MARTIN           1400
--CLARK             500
--SCOTT             500
--KING              500
--TURNER            500
--ADAMS             500
--JAMES             500
--FORD              500
--MILLER            500
select ename, case when comm is null then 500 when comm = 0 then 500 else comm end as comm
from emp
where hiredate > '1981-05-31'
;
--13. 1981년 6월 1일 ~ 1981년 12월 31일 입사자 중 부서명(DNAME)이 SALES인 사원의 부서번호, 사원명, 직업, 입사일을 출력하시오.
---조건1. 입사일 오름차순 정렬
--
--    DEPTNO DNAME          ENAME      JOB       HIREDATE 
------------ -------------- ---------- --------- --------------------------------
--        30 SALES          TURNER     SALESMAN  1981-09-08                      
--        30 SALES          MARTIN     SALESMAN  1981-09-28                      
--        30 SALES          JAMES      CLERK      1981-12-03
select e.deptno, d.dname, e.ename, e.job, to_char(e.hiredate, 'YYYY-MM-DD')
from emp e, dept d
where e. deptno = d.deptno and
e.hiredate between '1981-06-01' and '1981-12-31' and
d.dname = 'SALES'
order by hiredate asc
;
--14. 현재 시간과 현재 시간으로부터 한 시간 후의 시간을 출력하시오.
---조건1. 현재시간 포맷은 ‘4자리년-2자일월-2자리일 24시:2자리분:2자리초’로 출력
---조건1. 한시간후 포맷은 ‘4자리년-2자일월-2자리일 24시:2자리분:2자리초’로 출력
--
--현재시간                한시간후               
--------------------- -------------------
--2012-07-31 05:43:45 2012-07-31 06:43:45
select to_char(sysdate, 'YYYY-MM-DD HH24:MI:SS')as 현재시간, to_char(sysdate+1/24, 'YYYY-MM-DD HH24:MI:SS')as 한시간후
from dual
;

--15. 각 부서별 사원수를 출력하시오.
---조건1. 부서별 사원수가 없더라도 부서번호, 부서명은 출력
---조건2. 부서별 사원수가 0인 경우 ‘없음’ 출력
---조건3. 부서번호 오름차순 정렬
--DEPTNO DNAME          사원수                                     
------------ -------------- ----------------------------------------
--        10 ACCOUNTING 3                                       
--        20 RESEARCH 5                                       
--        30 SALES 6                                       
--        40 OPERATIONS 없음   
select e.deptno, d.dname
from emp e, dept d
where e.deptno(+) = d.deptno
;


--16.사원 테이블에서 각 사원의 사원번호, 사원명, 매니저번호, 매니저명을 출력하시오.
---조건1. 각 사원의 급여(SAL)는 매니저 급여보다 많거나 같다.
--
--      사원번호 사원명      매니저사원번호   매니저명      
------------ ---------- ---------- ----------
--      7902 FORD             7566  JONES     
--      7788 SCOTT            7566  JONES
select e.empno as 사원번호, e.ename as 사원명, m.mgr as 매니저번호, m.ename as 매니저명
from emp e, emp m
where e.deptno = m.deptno and e.mgr = m.empno and e.sal >= m.sal
;

--18. 사원명의 첫 글자가 ‘A’이고, 처음과 끝 사이에 ‘LL’이 들어가는 사원의 커미션이 COMM2일때, 
--모든 사원의 커미션에 COMM2를 더한 결과를 사원명, COMM, COMM2, COMM+COMM2로 출력하시오.
--
--ENAME            COMM      COMM2 COMM+COMM2
------------ ---------- ---------- ----------
--ADAMS               0        300        300
--ALLEN             300        300        600
--BLAKE               0        300        300
--CLARK               0        300        300
--FORD                0        300        300
--JAMES               0        300        300
--JONES               0        300        300
--KING                0        300        300
--MARTIN           1400        300       1700
--MILLER              0        300        300
--SCOTT               0        300        300
--SMITH               0        300        300
--TURNER              0        300        300
--WARD              500        300        800
select ename, nvl(comm,0) as comm, (select comm from emp where ename like 'A%LL%') as comm2,
nvl(comm,0) + (select comm from emp where ename like 'A%LL%') as 합친값
from emp
order by ename;

--19. 각 부서별로 1981년 5월 31일 이후 입사자의 부서번호, 부서명, 사원번호, 사원명, 입사일을 출력하시오.
---조건1. 부서별 사원정보가 없더라도 부서번호, 부서명은 출력
---조건2. 부서번호 오름차순 정렬
---조건3. 입사일 오름차순 정렬
--
--        DEPTNO DNAME               EMPNO ENAME      HIREDATE 
------------ -------------- ---------- ---------- ---------
--        10 ACCOUNTING           7782 CLARK      09-6-81  
--        10 ACCOUNTING           7839 KING       17-11-81 
--        10 ACCOUNTING           7934 MILLER     23-1-82  
--        20 RESEARCH             7902 FORD       03-12-81 
--        20 RESEARCH             7788 SCOTT      19-4-87  
--        20 RESEARCH             7876 ADAMS      23-5-87  
--        30 SALES                7844 TURNER     08-9-81  
--        30 SALES                7654 MARTIN     28-9-81  
--        30 SALES                7900 JAMES      03-12-81 
--        40 OPERATIONS
select e.deptno, d.dname, e.empno, e.ename, to_char(e.hiredate, 'DD-MM-YY')
from emp e, dept d
where e.deptno = d.deptno and hiredate > '1981-05-31'
order by deptno, hiredate
;
--20. 입사일로부터 지금까지 근무년수가 40년 미만인 사원의 사원번호, 사원명, 입사일, 근무년수를 출력하시오.
---조건1. 근무년수는 월을 기준으로 버림 (예:30.4년 = 30년, 30.7년=30년)
--
--     EMPNO ENAME   HIREDATE 근무년수
------------ ---------- ----------  ----------
--      7788 SCOTT      1987-04-19     25
--    7876 ADAMS      1987-05-23     25

select empno, ename, to_char(hiredate, 'YYYY-MM-DD'), trunc((sysdate - hiredate)/365) as 근무년수
from emp
where trunc((sysdate - hiredate)/365) < 40
;

다시 풀어볼 문항 = 6 11 15 19

반응형

'KOSTA교육 > 수업' 카테고리의 다른 글

[10/100] 240423  (0) 2024.04.23
[9/100] 240422  (0) 2024.04.22
[7/100] 240418  (0) 2024.04.18
[6/100] 240417  (0) 2024.04.17
[5/100]240416  (0) 2024.04.16