코딩테스트/HackerRank SQL

[HackerRank SQL] New Companies

공부하는 sum 2022. 7. 17. 02:50
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