QUIZ01

각 사원 별 커미션(COMM)이 0 또는 NULL이고 부서위치가 ‘GO’로 끝나는 사원의 정보를 사원번호, 사원이름, 커미션, 부서번호, 부서명, 부서위치를 출력하여라.

조건1. 커미션(COMM)이 NULL이면 0으로 출력

SELECT FIRST.*
FROM(
SELECT E.EMPNO, E.ENAME, NVL(E.COMM,0) AS COMM, D.DEPTNO, D.DNAME, D.LOC
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO
)FIRST
WHERE FIRST.COMM = 0 AND FIRST.LOC LIKE '%GO';

QUIZ02

각 부서 별 평균 급여가 2000 이상이면 초과, 그렇지 않으면 미만을 출력하시오.

SELECT NEW_TB.DEPTNO, NEW_TB. AVG_NEW,
CASE
WHEN AVG_NEW >= 2000 THEN '초과'
ELSE '미만'
END AS 평균급여
FROM
(
SELECT D.DEPTNO, ROUND(AVG(E.SAL),2) AS AVG_NEW
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO
GROUP BY D.DEPTNO
) NEW_TB
ORDER BY NEW_TB.DEPTNO ASC;

QUIZ03

각부서별 입사일이 가장 오래된 사원을 한 명씩 선별해 사원번호, 사원명, 부서번호, 입사일을 출력하시오.

SELECT EMPNO, ENAME, DEPTNO, HIREDATE
FROM EMP
WHERE HIREDATE IN (
SELECT MIN(HIREDATE)
FROM EMP
GROUP BY DEPTNO
)
ORDER BY DEPTNO ASC
;

QUIZ04

EMP 테이블에서 부서 인원이 4명보다 많은 부서의 부서번호, 인원수, 급여의 합을 출력하시오.

SELECT T1.DEPTNO, T1.COUNT, T1.SUM
FROM
(
SELECT DEPTNO, COUNT(ENAME) AS COUNT, SUM(SAL) AS SUM
FROM EMP
GROUP BY DEPTNO) T1
WHERE COUNT > 4; 

QUIZ05

EMP 테이블에서 가장 많은 사원이 속해있는 부서번호와 사원수를 출력하시오.

SELECT DEPTNO, "COUNT(*)"
FROM
(
SELECT DEPTNO, COUNT(EMPNO) AS "COUNT(*)"
FROM EMP
GROUP BY DEPTNO
ORDER BY DEPTNO DESC)
WHERE ROWNUM = 1;

--다른 풀이 방법
SELECT DEPTNO, COUNT(1) AS CNT
FROM EMP
GROUP BY DEPTNO
HAVING COUNT(1) = (SELECT MAX(COUNT(1)) FROM EMP GROUP BY DEPTNO);

QUIZ06

EMP 테이블에서 가장 많은 사원을 갖는 MGR의 사원번호를 출력하시오.

SELECT MGR AS EMPNO, T1.CNT 
FROM
(
SELECT MGR, COUNT(MGR) AS CNT
FROM EMP
GROUP BY MGR
ORDER BY CNT DESC) T1
WHERE ROWNUM = 1
;

QUIZ07

가장 높은 급여를 받는 사원보다 입사일이 늦은 사원들의 이름, 입사일을 출력

SELECT ENAME, HIREDATE
FROM EMP
WHERE HIREDATE > (SELECT HIREDATE
                    FROM EMP
                        WHERE SAL IN (SELECT MAX(SAL)
                                                FROM EMP)
)
;

--또는

SELECT ENAME, TO_CHAR(HIREDATE, 'YYYY-MM-DD') AS HIREDATE
FROM EMP
WHERE TO_CHAR(HIREDATE, 'YYYY-MM-DD') > (SELECT TO_CHAR(HIREDATE, 'YYYY-MM-DD')
                    FROM EMP
                        WHERE SAL IN (SELECT MAX(SAL)
                                                FROM EMP)
)
;

QUIZ08

FORD 보다 입사일이 늦은 사원 중 급여가 가장 높은 사원의 이름과 급여를 출력

SELECT
ENAME, SAL
FROM 
(SELECT ENAME, SAL
FROM EMP
WHERE HIREDATE > (SELECT HIREDATE FROM EMP WHERE ENAME = 'FORD')
ORDER BY SAL DESC)
WHERE ROWNUM = 1;

QUIZ09

각 사원 별 시급을 계산하여 부서번호, 사원이름, 시급을 출력하시오.

조건1. 한달 근무일수는 20일, 하루 근무시간은 8시간이다.

조건2. 시급은 소수 두 번째 자리에서 반올림한다.

조건3. 부서별로 오름차순 정렬

조건4. 시급이 많은 순으로 출력.

SELECT DEPTNO, ENAME, ROUND(SAL / (20 * 8),1) AS 시급
FROM EMP
ORDER BY DEPTNO ASC, 시급 DESC;

QUIZ10

QUIZ09에서 시급이 15이상

SELECT T1.DEPTNO, T1.ENAME, T1.시급
FROM
(
SELECT DEPTNO, ENAME, ROUND(SAL / (20 * 8),1) AS 시급
FROM EMP
) T1
WHERE T1.시급 > 15
ORDER BY T1.DEPTNO ASC, T1.시급 DESC;

QUIZ11

입사일로부터 지금까지 근무년수가 40년 이상인 사원의 사원번호, 사원명, 입사일, 근무년수를 출력하시오.

조건. 근무년수는 월을 기준으로 버림 (예:30.4년 = 30년, 30.7년=30년)

SELECT S.*
FROM(
SELECT EMPNO, ENAME, HIREDATE, TRUNC((SYSDATE - HIREDATE) / 365) AS 근무년수
FROM EMP
) S
WHERE 근무년수 > 40;

-- 40년 미만

SELECT S.*
FROM(
SELECT EMPNO, ENAME, HIREDATE, TRUNC((SYSDATE - HIREDATE) / 365) AS 근무년수
FROM EMP
) S
WHERE 근무년수 < 40;

QUIZ12

MGR가 ‘KING‘인 모든 사원의 이름과 급여를 출력하라.

SELECT ENAME, SAL
FROM EMP
WHERE MGR IN
(SELECT EMPNO FROM EMP WHERE ENAME = 'KING')
;

QUIZ13

사원 테이블에서 각 사원의 사원번호, 사원명, 매니저번호, 매니저명을 출력하시오. 조건1. 각 사원의 급여(SAL)는 매니저 급여 이상이다.

SELECT ONE.EMPNO, ONE.ENAME, TWO.EMPNO AS MGR_NO, TWO.ENAME AS MGR_NAME
FROM EMP ONE, EMP TWO
WHERE ONE.MGR = TWO.EMPNO
AND ONE.SAL >= TWO.SAL;

QUIZ14

커미션을 받는 사원과 (부서번호, 월급)이 같은 사원의 이름, 월급, 부서번호를 출력하시오.

--처음에는 커미션 포함 월급이 일반 월급과 같은 사람을 구하는 것인 줄 알았다.
--처음 작성한 코드
SELECT E2.ENAME, E2.SAL, E2.DEPTNO
FROM EMP E1, EMP E2
WHERE (E1.SAL + E1.COMM) = E2.SAL;

--알고보니 커미션 받은 사원을 구하는 쿼리를 작성하는 것이었다.
-- 커미션 받은 사람
SELECT ENAME, SAL, DEPTNO
FROM EMP
WHERE (DEPTNO, SAL) IN (SELECT DEPTNO, SAL FROM EMP
WHERE COMM IS NOT NULL AND COMM > 0);

댓글남기기