데이터베이스
25일차//[Oracle] SUB QUERY 예제(2)
aesup
2021. 2. 16. 11:55
728x90
-- SCOTT
--59) DECODE 또는 CASE WHEN THEN 함수를 사용하여 다음 데이터에 따라 JOB열의 값을 기준으로
--모든 사원의 등급을 표시하시오.
--(CASE와 DECODE 모두 작성)
SELECT ename, job,
CASE job
WHEN 'PRESIDENT' THEN 'A'
WHEN' ANALYST' THEN 'B'
WHEN 'MANAGER' THEN 'C'
WHEN 'SALESMAN' THEN 'D'
WHEN 'CLERK' THEN 'E'
ELSE '기타'
END as 등급
FROM emp;
--60) BLAKE와 같은 부서에 있는 사원들의 이름과 입사일을 구하는데 BLAKE는 제외하고 출력하시오.(BLAKE가 여러명일 수 있음)
SELECT ename, hiredate, deptno
FROM emp
WHERE deptno IN (SELECT deptno
FROM emp
WHERE ename = 'BLAKE')
and ename != 'BLAKE' ;
--61) 평균급여보다 많은 급여를 받는 사원들의 사원번호, 이름, 월급을 출력하는데 월급이 높은 사람순으로 출력하시오.
SELECT empno, ename, sal
FROM emp
WHERE sal > (SELECT avg(sal)
FROM emp)
ORDER BY sal DESC;
--62) 10번부서에서 급여를 가장 적게 받는 사원과 동일한 급여를 받는 사원의 이름을 출력하시오.
SELECT ename, sal
FROM emp
WHERE sal = (SELECT MIN(sal)
FROM emp
WHERE deptno = 10);
--63) 사원수가 3명이 넘는 부서의 부서명과 사원수를 출력하시오.
SELECT d.dname, COUNT(a.empno)
FROM emp a, dept d
WHERE a.deptno = d.deptno
GROUP BY d.dname
HAVING COUNT(a.empno) > 3;
--64) 사원번호가 7844인 사원보다 빨리 입사한 사원의 이름과 입사일을 출력하시오.
SELECT ename, hiredate, (SELECT hiredate
FROM emp
WHERE empno = 7844)
FROM emp
WHERE hiredate < (SELECT hiredate
FROM emp
WHERE empno = 7844);
--65) 직속상사(mgr)가 KING인 모든 사원의 이름과 급여를 출력하시오.
SELECT mgr, ename, sal
FROM emp
WHERE mgr =(SELECT empno
FROM emp
WHERE ename = 'KING' );
--66) 20번 부서에서 가장 급여를 많이 받는 사원과 동일한 급여를 받는 사원의 이름과 부서명,급여, 급여등급을 출력하시오. --이상함
SELECT a.ename, a.deptno, b.dname, c.grade
FROM emp a, dept b, salgrade c
WHERE a.deptno = b.deptno
AND sal BETWEEN c.losal AND c.hisal
AND sal IN (SELECT MAX(sal)
FROM emp
WHERE deptno = 20);
--67) 총급여(sal+comm)가 (평균 급여)보다 많은 급여를 받는 사람의 부서번호, 이름, 총급여, 커미션을 출력하시오.(커미션은 유(O),무(X)로 표시하고 컬럼명은 "comm유무" 출력)
--1
SELECT deptno, ename, sal+NVL(comm,0) , NVL(comm,0),
CASE
WHEN COMM = NULL THEN 'x'
WHEN COMM IS NOT NULL THEN 'o'
END as "comm 유무"
FROM emp
WHERE sal+NVL(comm,0) > (SELECT AVG(sal) FROM emp);
--
--NVL2(컬럼, 컬럼이 NULL이 아닌 경우 값, 컬럼이 NULL인 경우 값)
--2
SELECT deptno, ename, sal+NVL(comm,0) , NVL(comm,0), NVL2(comm,'o','x')
FROM emp
WHERE sal+NVL(comm,0) > (SELECT AVG(sal) FROM emp);
--68) CHICAGO 지역에서 근무하는 사원의 평균 급여보다 높은 급여를 받는 사원의 이름과 급여, 지역명을 출력하시오.
--지역번호
--평균급여
--비교
SELECT a.ename, a.sal, b.loc
FROM emp a, dept b
WHERE a.deptno = b.deptno
AND
sal > (SELECT AVG(sal)
FROM emp
WHERE deptno = (SELECT deptno
FROM dept
WHERE loc = 'CHICAGO' ));
--69) 업무가 SALESMAN인 직원이 2명 이상인 부서의 이름, 근무하는 사원의 이름, 업무를 출력하시오.(컬럼명은 부서명, 사원명, 업무로 출력)
SELECT b.dname as 부서명,
a.ename as 사원명,
a.job as 업무
FROM emp a, dept b
WHERE a.deptno = b.deptno
and a.deptno = (SELECT deptno
FROM emp
WHERE job = 'SALESMAN'
GROUP BY deptno
HAVING count(job)>2 );
--70) 커미션이 없는 사원들 중 월급이 가장 높은 사원의 이름과 급여등급을 출력하시오.
SELECT a.ename, a.sal, s.grade, a.comm
FROM emp a, salgrade s
WHERE sal BETWEEN s.losal AND s.hisal
AND sal = (SELECT MAX(sal) FROM emp
WHERE comm IS NULL OR comm = 0);
--71) SMITH의 관리자(mgr)의 이름과 부서명, 근무지역을 출력하시오.
SELECT a.ename, a.mgr, b.dname, b.loc
FROM emp a, dept b
WHERE
a.deptno = a.deptno
AND a.empno = (SELECT mgr
FROM emp
WHERE ename = 'SMITH');
728x90