절대값 쓸때는 ABS함수를 사용한다.
SELECT ABS(1000 - 2590)
FROM DUAL;
https://blog.naver.com/operat723/220993517369
문제 1.
급여 순위 중 홀수번째에 해당하는 사원들의 급여를 10%감봉하여 전체 사원의 평균을 구하고 구한 평균 이상인 사람들의 급여를 20%감봉하여 전체 급여순위와 사원정보를 출력하시오.
SELECT B.ENAME, B.JOB,
CASE WHEN A.AVV <= B.SAL
THEN B.SAL * 0.8
ELSE B.SAL
END AS CH_SAL2,
RANK() OVER (ORDER BY CASE WHEN A.AVV <= B.SAL
THEN B.SAL * 0.8
ELSE B.SAL
END DESC)
FROM
(SELECT AVG(CH_SAL) AS AVV
FROM
(SELECT RANK() OVER(ORDER BY SAL DESC) AS RANK,
CASE
WHEN MOD( RANK() OVER(ORDER BY SAL DESC), 2) =1
THEN SAL *0.8
ELSE SAL
END AS CH_SAL
FROM EMP)) A
INNER JOIN EMP B ON 1=1
;
문제 2.
12월에 입사한 사원 중 급여 순위 2등의 급여보다 큰 사원들중 가장 많은 사원이 있는 업무를 구하시오.
SELECT *
FROM
(SELECT C.JOB, COUNT(C.JOB), RANK() OVER(ORDER BY COUNT(C.JOB) DESC) AS RNK
FROM
(SELECT *
FROM
(SELECT ENAME,SAL,RANK() OVER(ORDER BY SAL DESC) AS RNK
FROM EMP E INNER JOIN SALGRADE SG ON E.SAL BETWEEN SG.LOSAL AND SG.HISAL
WHERE TO_CHAR(HIREDATE, 'MM')= 12)A
WHERE A.RNK =2 ) B INNER JOIN EMP C ON 1=1
WHERE C.SAL > B.SAL
GROUP BY C.JOB)
WHERE RNK = 1
;
;
문제 3.
DALLAS에 업무하는 사원들의 전체 급여 합과 그 사원들을 제외한 사원들의 급여 합을 구하여 두 차이를 구하고 구한 차이 이상의 급여를 받는 사원들의 급여를 구한차이만큼 감봉하여 전체 사원의 정보를 출력하시오.
SELECT F.SAL,F.ENAME, F.JOB, F.MGR,F.HIREDATE,F.SAL,F.COMM,F.DEPTNO,
CASE
WHEN F.SAL >= C.VAL
THEN F.SAL - C.VAL
ELSE F.SAL
END AS RESAL
FROM
(SELECT ABS(SUM(A.SUM_DALLAS) - SUM(B.N_DALLAS)) AS VAL
FROM
(SELECT SUM(E.SAL) AS SUM_DALLAS
FROM EMP E INNER JOIN DEPT D ON E.DEPTNO = D.DEPTNO
WHERE D.LOC = 'DALLAS') A INNER JOIN
(SELECT SUM(E.SAL) AS N_DALLAS
FROM EMP E INNER JOIN DEPT D ON E.DEPTNO = D.DEPTNO
WHERE D.LOC != 'DALLAS') B ON 1=1)C INNER JOIN EMP F ON 1=1;
문제 4.
급여 등급이 2, 4등급인 사원들이 가장 많이 포함된 부서의 업무별 급여총계 순위를 출력하시오.
SELECT A.DEPTNO,E.JOB,SUM(E.SAL), RANK() OVER(PARTITION BY A.DEPTNO ORDER BY SUM(E.SAL) DESC) AS SUM_SAL
FROM
(SELECT DEPTNO
FROM EMP
WHERE JOB IN
(SELECT JOB
FROM
(SELECT JOB, COUNT(*), RANK() OVER(ORDER BY COUNT(*) DESC) AS RNK
FROM EMP E INNER JOIN SALGRADE SG ON E.SAL BETWEEN SG.LOSAL AND SG.HISAL
WHERE SG.GRADE IN (2,4)
GROUP BY JOB
)
WHERE RNK =1
)
)A INNER JOIN EMP E ON A.DEPTNO = E.DEPTNO
GROUP BY A.DEPTNO,E.JOB
문제 5.
KING을 제외한 사원들의 급여 최대치와 최소치를 구하고 그 차이를 구하여 전체 급여 평균과의 차이를 구하시오.
SELECT MAX(SAL) - MIN(SAL) A
FROM EMP
WHERE ENAME != 'KING' ;
SELECT AVG(SAL) B
FROM EMP ;
SELECT A-B
FROM (SELECT MAX(SAL) - MIN(SAL) A
FROM EMP
WHERE ENAME != 'KING') C INNER JOIN (SELECT AVG(SAL) B FROM EMP)D ON 1=1 ;