SQL 데이터 분석

[코딩테스트] 해커랭크 Hackerrank SQL New Companies 문제풀이

deviz 2024. 10. 22. 22:42
반응형

SQL 코딩테스트 준비를 위해 해커랭크 문제풀이를 해보려고 합니다. 서버는 MySQL을 기준으로 설정하였으며, 문제의 핵심은 sql로 조건문 case when 사용하고, where절에 not in을 이해하는 것입니다. SQL 코딩 능력을 키우고자 하는 분들에게 도움이 될 수 있도록 문제 해결에 필요한 사고 과정과 코드 설명을 상세히 다루었습니다.

 

 

문제 : New Companies (hackerrank sql, MySQL) 

 

난이도 : Medium

서버 : MySQL

문제 의도 : JOIN 이용 - JOIN 쿼리문을 작성할 수 있는지, 어떤 join을 활용해야 하는지 

테이블 이름 : Company Table, Lead_Manager Table, Senior_Manager Table, 
Manager Table, Employee Table

 

https://www.hackerrank.com/challenges/the-company/problem?isFullScreen=true

 

New Companies | HackerRank

Find total number of employees.

www.hackerrank.com

 

 

 

문제 요약 :

company_code별로 매니저 이름, lead managers 수, senior managers 수, managers 수, Employees 수

테이블을 만드시오. 

 

 


input sample

output sample

 

 

정답 SQL 코드 :

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 as c 
LEFT JOIN Lead_Manager as lm ON c.company_code = lm.company_code
LEFT JOIN Senior_Manager as sm ON c.company_code = sm.company_code
LEFT JOIN Manager as m ON c.company_code = m.company_code
LEFT JOIN Employee as e ON c.company_code = e.company_code
GROUP BY 1,2
ORDER BY company_code ASC

 

 

 

풀이과정 : 

(나의 풀이 사고과정 정리) 

 

처음에는, 테이블을 모두 JOIN해서 count 해주면 되겠다고 생각했다. 

그런데, JOIN 중 단순히 INNER JOIN을 사용하면 되겠다고 생각했지만 code상 통과이지만, 

자세히 데이터를 살펴보니 INNER JOIN이 아니라 LEFT JOIN을 사용해야 함을 발견했다. 

 

 

<오류> 

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 as c 
INNER JOIN Lead_Manager as lm ON c.company_code = lm.company_code
INNER JOIN Senior_Manager as sm ON c.company_code = sm.company_code
INNER JOIN Manager as m ON c.company_code = m.company_code
INNER JOIN Employee as e ON c.company_code = e.company_code
GROUP BY 1,2
ORDER BY company_code ASC

 

 

< INNER JOIN이 아니라 LEFT JOIN을 사용해야 하는 이유> 

INNER JOIN을 하면 테이블 모두 겹치는 데이터만 추출하게 되는데, 여기서 

 

Senior_Manager table에는 SM2가 있지만  Manager table를 살펴보면 SM2가 없다. 

이에 JOIN을 모두 할떄 SM2 와 같이 누락되는 데이터가 없으려면 INNER JOIN이 아니라 

LEFT JOIN을 사용해야 해당 데이터들이 남게된다. 

 

 

 

 

 

 

 

따라서, 다음과 같은 코드를 실행하면 정답!

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 as c 
LEFT JOIN Lead_Manager as lm ON c.company_code = lm.company_code
LEFT JOIN Senior_Manager as sm ON c.company_code = sm.company_code
LEFT JOIN Manager as m ON c.company_code = m.company_code
LEFT JOIN Employee as e ON c.company_code = e.company_code
GROUP BY 1,2
ORDER BY company_code ASC

 

반응형