본문으로 바로가기

DB-180309

category 프로그래밍/DB 2018. 3. 10. 23:01

 

 

 

 

-- 동일 부서에서 업무가 최종적으로 변경된 사원이 있는

 

-- 부서 사원들의 급여와 성과급을 포함한 지불금액의 순위를 구하시오.(강사님)

 

SELECT E.FIRST_NAME, D.DEPARTMENT_NAME, E.SALARY + (E.SALARY * NVL(E.COMMISSION_PCT, 0)) AS RE_SAL,

 

       RANK() OVER(PARTITION BY E.DEPARTMENT_ID

 

                   ORDER BY E.SALARY + (E.SALARY * NVL(E.COMMISSION_PCT, 0)) DESC) AS RNK

 

FROM EMPLOYEES E INNER JOIN DEPARTMENTS D

 

                         ON E.DEPARTMENT_ID = D.DEPARTMENT_ID

 

                 INNER JOIN (SELECT JH.EMPLOYEE_ID, JH.DEPARTMENT_ID,

 

                                    COUNT(*) AS CNT, COUNT(E.EMPLOYEE_ID) AS ECNT

 

                             FROM JOB_HISTORY JH LEFT OUTER JOIN EMPLOYEES E

 

                                                              ON JH.EMPLOYEE_ID = E.EMPLOYEE_ID

 

                                                             AND JH.DEPARTMENT_ID = E.DEPARTMENT_ID

 

                                                             AND ((JH.START_DATE = E.HIRE_DATE AND JH.JOB_ID != E.JOB_ID)

 

                                                                 OR JH.START_DATE != E.HIRE_DATE)

 

                             GROUP BY JH.EMPLOYEE_ID, JH.DEPARTMENT_ID) A

 

                         ON E.DEPARTMENT_ID = A.DEPARTMENT_ID

 

                        AND A.CNT = A.ECNT

 

 

 

IOT2 정상락

2018.03.09. 18:23        

 

-- 동일 부서에서 업무가 최종적으로 변경된 사원이 있는 부서의 급여와 성과급을 포함한 지불금액 순위를 구하시오.

-- INNER JOIN써서 한거

SELECT E.FIRST_NAME,D.DEPARTMENT_NAME,

CASE WHEN E.COMMISSION_PCT IS NULL

 THEN E.SALARY

 ELSE E.SALARY+E.SALARY*E.COMMISSION_PCT

 END AS CH_SAL,

 RANK()OVER(PARTITION BY E.DEPARTMENT_ID ORDER BY CASE WHEN E.COMMISSION_PCT IS NULL

 THEN E.SALARY

 ELSE E.SALARY+E.SALARY*E.COMMISSION_PCT

 END DESC) AS RNK

FROM EMPLOYEES E INNER JOIN DEPARTMENTS D ON E.DEPARTMENT_ID=D.DEPARTMENT_ID

WHERE E.DEPARTMENT_ID IN

(SELECT A.DEPARTMENT_ID

FROM

(SELECT A.EMPLOYEE_ID,A.JOB_ID,A.DEPARTMENT_ID

FROM

(SELECT JH.EMPLOYEE_ID,JH.START_DATE,E.DEPARTMENT_ID,JH.JOB_ID,

RANK()OVER(PARTITION BY JH.EMPLOYEE_ID ORDER BY START_DATE ASC) AS RNK

FROM JOB_HISTORY JH INNER JOIN EMPLOYEES E ON E.EMPLOYEE_ID=JH.EMPLOYEE_ID

WHERE JH.DEPARTMENT_ID=E.DEPARTMENT_ID)A

WHERE A.RNK=1)A

INNER JOIN

EMPLOYEES E ON A.EMPLOYEE_ID=E.EMPLOYEE_ID AND A.JOB_ID!=E.JOB_ID)

;

 

 

 

--OUTER JOIN 쓴거

SELECT E.FIRST_NAME,D.DEPARTMENT_NAME,

CASE WHEN E.COMMISSION_PCT IS NULL

 THEN E.SALARY

 ELSE E.SALARY+E.SALARY*E.COMMISSION_PCT

 END AS CH_SAL,

RANK()OVER(PARTITION BY E.DEPARTMENT_ID ORDER BY CASE WHEN E.COMMISSION_PCT IS NULL

 THEN E.SALARY

 ELSE E.SALARY+E.SALARY*E.COMMISSION_PCT

 END DESC) AS RNK

FROM EMPLOYEES E INNER JOIN

(SELECT A.DEPARTMENT_ID

FROM

 (SELECT NVL(E.EMPLOYEE_ID,0)AS ACE,JH.DEPARTMENT_ID

 FROM JOB_HISTORY JH LEFT OUTER JOIN EMPLOYEES E

 ON E.EMPLOYEE_ID=JH.EMPLOYEE_ID AND E.JOB_ID!=JH.JOB_ID AND E.DEPARTMENT_ID=JH.DEPARTMENT_ID)A

 WHERE A.ACE NOT IN

 (SELECT NVL(E.EMPLOYEE_ID,0)

 FROM (SELECT EMPLOYEE_ID,JOB_ID,DEPARTMENT_ID

 FROM

 (SELECT EMPLOYEE_ID,JOB_ID,START_DATE,DEPARTMENT_ID,

 RANK()OVER(PARTITION BY EMPLOYEE_ID ORDER BY START_DATE) AS RNK

 FROM JOB_HISTORY)A

 WHERE A.RNK=1) JH

 LEFT OUTER JOIN EMPLOYEES E

 ON E.EMPLOYEE_ID=JH.EMPLOYEE_ID

 AND E.JOB_ID=JH.JOB_ID

 AND E.DEPARTMENT_ID=JH.DEPARTMENT_ID))A

ON E.DEPARTMENT_ID=A.DEPARTMENT_ID

INNER JOIN DEPARTMENTS D ON E.DEPARTMENT_ID=D.DEPARTMENT_ID

;

 

--INNER JOIN LEFT JOIN으로 바꾼거

SELECT E.FIRST_NAME,D.DEPARTMENT_NAME,

CASE WHEN E.COMMISSION_PCT IS NULL

 THEN E.SALARY

 ELSE E.SALARY+E.SALARY*E.COMMISSION_PCT

 END AS CH_SAL,

 RANK()OVER(PARTITION BY E.DEPARTMENT_ID ORDER BY CASE WHEN E.COMMISSION_PCT IS NULL

 THEN E.SALARY

 ELSE E.SALARY+E.SALARY*E.COMMISSION_PCT

 END DESC) AS RNK

FROM EMPLOYEES E LEFT OUTER JOIN DEPARTMENTS D ON E.DEPARTMENT_ID=D.DEPARTMENT_ID

WHERE E.DEPARTMENT_ID IN

(SELECT A.DEPARTMENT_ID

FROM

(SELECT A.EMPLOYEE_ID,A.JOB_ID,A.DEPARTMENT_ID

FROM

(SELECT JH.EMPLOYEE_ID,JH.START_DATE,E.DEPARTMENT_ID,JH.JOB_ID,

RANK()OVER(PARTITION BY JH.EMPLOYEE_ID ORDER BY START_DATE ASC) AS RNK

FROM JOB_HISTORY JH LEFT OUTER JOIN EMPLOYEES E ON E.EMPLOYEE_ID=JH.EMPLOYEE_ID

WHERE JH.DEPARTMENT_ID=E.DEPARTMENT_ID)A

WHERE A.RNK=1)A

INNER JOIN

EMPLOYEES E ON A.EMPLOYEE_ID=E.EMPLOYEE_ID AND A.JOB_ID!=E.JOB_ID)

;

 

 

--INNER JOIN 3번 쓴거

SELECT E.FIRST_NAME,D.DEPARTMENT_NAME,

CASE WHEN E.COMMISSION_PCT IS NULL

 THEN E.SALARY

 ELSE E.SALARY+E.SALARY*E.COMMISSION_PCT

 END AS CH_SAL,

 RANK()OVER(PARTITION BY E.DEPARTMENT_ID ORDER BY CASE WHEN E.COMMISSION_PCT IS NULL

 THEN E.SALARY

 ELSE E.SALARY+E.SALARY*E.COMMISSION_PCT

 END DESC) AS RNK

FROM EMPLOYEES E

INNER JOIN DEPARTMENTS D ON E.DEPARTMENT_ID=D.DEPARTMENT_ID

WHERE E.DEPARTMENT_ID IN

(SELECT A.DEPARTMENT_ID

FROM (SELECT E.EMPLOYEE_ID,E.DEPARTMENT_ID

FROM JOB_HISTORY JH INNER JOIN EMPLOYEES E ON E.EMPLOYEE_ID=JH.EMPLOYEE_ID

WHERE JH.DEPARTMENT_ID=E.DEPARTMENT_ID)A

WHERE A.EMPLOYEE_ID !=

(SELECT JH.EMPLOYEE_ID

FROM JOB_HISTORY JH INNER JOIN EMPLOYEES E

ON E.EMPLOYEE_ID=JH.EMPLOYEE_ID AND E.HIRE_DATE=JH.START_DATE

AND E.JOB_ID=JH.JOB_ID

WHERE JH.DEPARTMENT_ID=E.DEPARTMENT_ID))

;        

 

 

 

 

 

 

 

 

 IoT2강원준

2018.03.10. 14:36        

 

 

SELECT E.FIRST_NAME, D.DEPARTMENT_NAME, E.SALARY + NVL(E.SALARY * E.COMMISSION_PCT, 0) AS C_SAL,

 RANK() OVER(PARTITION BY E.DEPARTMENT_ID ORDER BY E.SALARY + NVL(E.SALARY * E.COMMISSION_PCT, 0) DESC) AS RNK

FROM EMPLOYEES E INNER JOIN DEPARTMENTS D

 ON E.DEPARTMENT_ID = D.DEPARTMENT_ID

WHERE E.DEPARTMENT_ID IN (SELECT JH.DEPARTMENT_ID

 FROM EMPLOYEES E INNER JOIN JOB_HISTORY JH

 ON E.EMPLOYEE_ID = JH.EMPLOYEE_ID AND E.DEPARTMENT_ID = JH.DEPARTMENT_ID

 INNER JOIN (SELECT JH.EMPLOYEE_ID

 FROM EMPLOYEES E LEFT OUTER JOIN JOB_HISTORY JH

 ON E.EMPLOYEE_ID = JH.EMPLOYEE_ID AND E.DEPARTMENT_ID = JH.DEPARTMENT_ID AND

 JH.START_DATE = E.HIRE_DATE AND JH.JOB_ID = E.JOB_ID) E1

 ON E1.EMPLOYEE_ID != E.EMPLOYEE_ID)

;        

 

 

 

'프로그래밍 > DB' 카테고리의 다른 글

DB-180313  (492) 2018.03.18
DB-180312  (485) 2018.03.13
DB-130308  (501) 2018.03.10
DB-180307  (492) 2018.03.10
DB-180306  (496) 2018.03.10