1. 부서별 부서장 정보를 출력하시오.

SELECT DEPT_NAME, FIRST_NAME, LAST_NAME, SALARY

  FROM DEPT_MANAGER DM

  INNER JOIN DEPARTMENTS DEP ON DEP.DEPT_NO=DM.DEPT_NO

  INNER JOIN EMPLOYEES EMP ON EMP.EMP_NO=DM.EMP_NO

  INNER JOIN SALARIES SAL ON SAL.EMP_NO=DM.EMP_NO

WHERE DM.TO_DATE='9999-01-01' AND SAL.TO_DATE='9999-01-01'

ORDER BY DEPT_NAME;


2. 부서별 정보(부서장, 부서별 급여 평균)을 출력하시오.

SELECT DEPT_NAME, FIRST_NAME, LAST_NAME, AVG_SALARY

  FROM DEPT_MANAGER DM

  INNER JOIN DEPARTMENTS DEP ON DEP.DEPT_NO=DM.DEPT_NO

  INNER JOIN EMPLOYEES EMP ON EMP.EMP_NO=DM.EMP_NO

  INNER JOIN (
            SELECT DEPT_NO, AVG(SALARY) AVG_SALARY

              FROM DEPT_EMP DE

              INNER JOIN SALARIES SAL ON SAL.EMP_NO=DE.EMP_NO

             WHERE DE.TO_DATE='9999-01-01' AND SAL.TO_DATE='9999-01-01'

             GROUP BY DEPT_NO

) DS ON DS.DEPT_NO=DM.DEPT_NO

 WHERE DM.TO_DATE='9999-01-01' 

 ORDER BY DEPT_NAME


3. 부서별 직원 리스트를 출력하되 부서장이면 표시를 하고,

   각 부서에서 가장 먼저 나오게 출력하시오.

SELECT DEPT_NAME, FIRST_NAME, LAST_NAME, IF(DM.EMP_NO IS NULL, NULL, 'MANAGER') POSITION

  FROM DEPT_EMP DE

  INNER JOIN DEPARTMENTS DEP ON DEP.DEPT_NO=DE.DEPT_NO

  INNER JOIN EMPLOYEES EMP ON EMP.EMP_NO=DE.EMP_NO

    LEFT OUTER JOIN DEPT_MANAGER DM ON DM.EMP_NO=DE.EMP_NO AND DM.TO_DATE='9999-01-01'

 WHERE DE.TO_DATE='9999-01-01' 

 ORDER BY DEPT_NAME, DM.EMP_NO DESC, FIRST_NAME, LAST_NAME


4. 부서별 직원 리스트와 급여를 출력하되,

   부서장이면 표시를 하고 직원들의 급여 평균을 표시하시오.

  이 문제는 실적 계산에 많이 사용하는 SQL문으로

  급여가 아닌 실적으로 하는 것이 적절하지만 데이터가 없어서

  급여를 실적처럼 사용해서 문제를 풀어본다.

  즉, 개인은 개인의 실적, 팀장은 팀원 실적의 평균으로 계산.

SELECT DEPT_NAME, FIRST_NAME, LAST_NAME

        , IF(DM.EMP_NO IS NULL, SAL.SALARY, DS.AVG_SALARY) AVG_SALARY

        , IF(DM.EMP_NO IS NULL, NULL, 'MANAGER') POSITION

  FROM DEPT_EMP DE

INNER JOIN DEPARTMENTS DEP ON DEP.DEPT_NO=DE.DEPT_NO

INNER JOIN EMPLOYEES EMP ON EMP.EMP_NO=DE.EMP_NO

INNER JOIN SALARIES SAL ON SAL.EMP_NO=DE.EMP_NO

   LEFT OUTER JOIN DEPT_MANAGER DM ON DM.EMP_NO=DE.EMP_NO AND DM.TO_DATE='9999-01-01'

   LEFT OUTER JOIN (

            SELECT DEPT_NO, AVG(SALARY) AVG_SALARY

              FROM DEPT_EMP DE

             INNER JOIN SALARIES SAL ON SAL.EMP_NO=DE.EMP_NO

             WHERE DE.TO_DATE='9999-01-01' AND SAL.TO_DATE='9999-01-01'

             GROUP BY DEPT_NO

) DS ON DS.DEPT_NO=DE.DEPT_NO

WHERE DE.TO_DATE='9999-01-01' AND SAL.TO_DATE='9999-01-01'

ORDER BY DEPT_NAME, DM.EMP_NO DESC, FIRST_NAME, LAST_NAME



'Database > SQL 연습' 카테고리의 다른 글

실습 2 - GROUP  (2) 2016.04.02
실습 3 - Join  (0) 2016.04.02
실습 4 - SubQuery  (0) 2016.04.02
연습 1  (3) 2016.04.02
연습 3  (0) 2016.04.02

+ Recent posts