728x90
- 각 회사의 계층 구조

- 출력해야 할 것
company_code, founder name, total number of lead managers, total number of senior managers, total number of managers, and total number of employees
→ 회사 코드, 창업자 이름, 리드매니저 수, 시니어 매니저 수, 매니저 수, 직원 수 - 정렬
company_code를 기준으로 asc - 알아둘 것
- 테이블에는 중복 레코드가 포함될 수 있음
- company_code는 문자열이기 때문에 C_1, C_2, C_10이 있다면 C_1, C_10, C_2 순서대로 출력되어야 함
Input Format
- Company
- company_code
- founder
- Lead_manager
- lead_manager_code
- company_code
- Senior_Manager
- senior_manager_code
- lead_manager_code
- company_code
- Manager
- manager_code
- senior_manager_code
- lead_manager_code
- company_code
- Employee
- employee_code
- manager_code
- senior_manager_code
- lead_manager_code
- company_code
Sample Output

→ 회사 코드, 창업자 이름, 리드매니저 수, 시니어 매니저 수, 매니저 수, 직원 수
풀이
SELECT c.company_code,
c.founder,
count(distinct lm.lead_manager_code),
count(distinct sm.senior_manager_code),
count(distinct m.manager_code),
count(distinct e.employee_code)
FROM Company c
LEFT JOIN Lead_Manager lm
ON c.company_code = lm.company_code
LEFT JOIN Senior_Manager sm
ON lm.lead_manager_code = sm.lead_manager_code
LEFT JOIN Manager m
ON sm.senior_manager_code = m.senior_manager_code
LEFT JOIN Employee e
ON m.manager_code = e.manager_code
GROUP BY c.company_code, c.founder
ORDER BY c.company_code
제일 기초가 되는 company_code와 founder가 있는 Company 테이블을 기준으로 삼고, 나머지 테이블을 Left join 으로 하나씩 붙여가면서 최종 데이터셋을 만든다.
사실 Employee에 senior_manager, lead_manager, manager 코드가 다 있어서 이걸로 해결해보면 되지 않을까? 했지만 꼭 하위 코드가 있으리라는 보장이 없어서 하나씩 붙여가면서 해결했다.
company_code와 founder를 기준으로 나머지 코드들의 고유 개수를 세는 것이기 때문에 저 둘은 group by 로 처리하고, 나머지는 count에 distinct를 해서 고유 값을 세도록 처리했다.
하나씩 left join으로 처리해서 약간 무식하게 해결했다는 생각도 조금 드는데...
더 효율적인 방법이 있는지 고민해 볼 필요가 있을 것 같다.
728x90
'코딩테스트 > HackerRank SQL' 카테고리의 다른 글
| [HackerRank SQL] Weather Observation Station 20 (0) | 2022.07.17 |
|---|