Employees 테이블:
EmployeeID | Name | Department | Salary | ManagerID |
1 | Alice | HR | 70000 | NULL |
2 | Bob | IT | 90000 | 1 |
3 | Charlie | IT | 80000 | 2 |
4 | David | IT | 85000 | 2 |
5 | Eve | HR | 75000 | 1 |
6 | Frank | Finance | 95000 | NULL |
7 | Grace | Finance | 80000 | 6 |
8 | Heidi | IT | 95000 | 2 |
요구사항:
1. 각 직원의 이름, 부서, 월급, 그리고 그 직원이 속한 부서에서 가장 높은 월급을 받고 있는 직원의 이름과 월급을 조회하는 SQL 쿼리를 작성해주세요
// 내가 작성한 쿼리: 완전 틀림! 꽝
SELECT Name,
Department,
Salary,
Top_Earner,
Top_salary
FROM Employees e
OUTER JOIN a ON e.Department = a.Department
(
SELECT Department,
Name Top_Earner,
Top_salary
FROM
(
SELECT MAX(Salary) Top_salary
FROM Employees
GROUP BY Department
)) a;
// 정답
SELECT
e1.Name,
e1.Department,
e1.Salary,
e2.Name AS Top_Earner,
e2.Salary AS Top_Salary
FROM
Employees e1
JOIN
Employees e2 ON e1.Department = e2.Department
WHERE
e2.Salary = (
SELECT MAX(Salary)
FROM Employees e3
WHERE e3.Department = e1.Department
);
// e2는 MAX(Salary)를 가진 직원만 포함된 데이터
// e1, e2, e3 구분 필수
- 기대결과
Name | Department | Salary | Top_Earner | Top_Salary |
Alice | HR | 70000 | Eve | 75000 |
Bob | IT | 90000 | Heidi | 95000 |
Charlie | IT | 80000 | Heidi | 95000 |
David | IT | 85000 | Heidi | 95000 |
Eve | HR | 75000 | Eve | 75000 |
Frank | Finance | 95000 | Frank | 95000 |
Grace | Finance | 80000 | Frank | 95000 |
Heidi | IT | 95000 | Heidi | 95000 |
2. 부서별로 평균 월급이 가장 높은 부서의 이름과 해당 부서의 평균 월급을 조회하는 SQL 쿼리를 작성해주세요
// 내가 작성한 쿼리: 현재 테이블에서는 동일한 결과 출력 가능
SELECT Department,
AVG(Salary) Avg_Salary
FROM Employees
GROUP BY Department
ORDER BY Avg_Salary DESC
LIMIT 1;
// 최고 평균 급여를 가진 부서가 여러 개일 경우, 이 쿼리는 하나의 부서만 반환
// 정답
SELECT Department,
AVG(Salary) AS Avg_Salary
FROM Employees
GROUP BY Department
HAVING
AVG(Salary) = (
SELECT MAX(Avg_Salary)
FROM
(SELECT AVG(Salary) AS Avg_Salary
FROM Employees
GROUP BY Department) AS subquery
);
// 부서별 AVG(Salary) 중 MAX값 SELECT -> 이 값을 AVG(Salary)로 가진 부서명과 AVG(Salary)값 출력
// 동점 처리 가능, 다른 조건 추가나 더 복잡한 로직 적용 용이
// 쿼리가 길어지고 이해하기 어려움, 데이터 크기가 커지면 성능이 떨어질 수 있음
- 기대결과
Department | Avg_Salary |
IT | 87500 |
제약사항:
- 두 쿼리 모두 서브쿼리, JOIN, GROUP BY, HAVING 등의 기능을 활용해주세요.
'DATA 사전캠프' 카테고리의 다른 글
15일차 SQL 스터디: 예산이 가장 큰 프로젝트는? (0) | 2024.11.22 |
---|---|
15일차 SQL 스터디: 가장 많이 팔린 품목은? (0) | 2024.11.22 |
14일차 Python 스터디: 랜덤 닉네임 생성기 (0) | 2024.11.21 |
14일차 SQL 스터디: 단골 고객님 찾기 (1) | 2024.11.21 |
14일차 SQL 스터디: 이용자의 포인트 조회하기 (0) | 2024.11.21 |