[SQL 문제풀이] - 다중 join + group by의 적용
2025.02.24 - [프로그래밍/SQL, Hive, SAS 관련 정보] - [SQL] Table of Contents
https://www.hackerrank.com/challenges/the-company/problem?isFullScreen=true
New Companies | HackerRank
Find total number of employees.
www.hackerrank.com
오답노트)
너무 오랜만에 SQL의 중급기술을 써야하는 상황이 되다보니... 처음 풀었을 때는 with절로 manager table들을 각각 group by 해서 count하고 join을 하려고 시도했습니다. 이 때 distinct() - 중복이 있을 수 있다는 점을 간과했으며, join 시에도 다중 join을 한번에 하는 게 아니라 sub-query이용하는 식으로 -_- 코드를 짰는데요.
다시 곱씹어보면 이 문제는..
1) manager table들에서 group by가 되어야 하고 이들을 다중 join 해야겠다
2) GroupBy/Join 중에서 어느것을 먼저해야할까? GroupBy를 먼저하고 join을 하게되면 쿼리가 지나치게 복잡해질 것 같은데 join 후에 groupby하는 방법은 없을까?
==> 일단 left join해서 가장 세부레벨인 empolyee레벨까지 조인시킨 테이블을 상상해보면 empolyee가 빠짐없이 중복없이 있을테고 각각의 empolyee를 따라 manager들의 정보는 중복이 있을 것이다. Count(Distinct())를 사용해야겠다.
3) 그룹별(partition 별)로 세어야 하는가? 아니면 전체 테이블에서 그냥 세면 되는가?
==> Group별로 세 주어야 하기 때문에 Group by
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
실제로 실행해보니 앞 단의 manager들에 중복이 있었기에 employee도 그에 따라 중복이 존재하므로 역시 distinct를 적용해야한다.