CODING TEST/SQL : HackerRank

[MYSQL] New Companies

주 녕 2022. 9. 30. 19:24
728x90

 

▶ SQL  >  Advanced Select > New Companies

 

 Problem 

Given the table schemas below, write a query to print the company_codefounder name, total number of lead managers, total number of senior managers, total number of managers, and total number of employees. Order your output by ascending company_code.

  • Company_code
  • founder의 이름
  • lead manager의 수
  • senior manager의 수
  • manager의 수
  • employee의 수

를 company_code로 오름차순으로 정렬하라.

Note

  • 테이블은 중복 레코드를 가지고 있을 수 있음
  • company_code는 문자열이므로, C_1, C_2, C_10일 경우 C_1, C_10, C_2로 정렬됨

Sample Input

Company Table: 

 Lead_Manager Table: 

 Senior_Manager Table: 

 Manager Table: 

 Employee Table: 

 

 My Answer 

< Answer 1 >

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 C.company_code = SM.company_code
    LEFT JOIN Manager M ON C.company_code = M.company_code
    LEFT JOIN Employee E ON C.company_code = E.company_code
GROUP BY C.company_code, C.founder
ORDER BY C.company_code
  • 각 계급에 있는 사람의 수를 구해야 하므로 COUNT를 사용했고, 중복된 레코드는 제거하기 위해 DISTINCT를 사용함
  • Lead_Manager, Senior_Manager, Managre, Employee 테이블을 여러 번의 Join을 통해 결과물을 도출
  • 문제에서 요구한 것은 각 회사에 대한 결과값이기 때문에 공통된 company_code를 join의 조건으로 사용함

< Answer 2 >

SELECT C.company_code, C.founder, 
    COUNT(DISTINCT E.lead_manager_code), 
    COUNT(DISTINCT E.senior_manager_code), 
    COUNT(DISTINCT E.manager_code), 
    COUNT(DISTINCT E.employee_code)
FROM Company C LEFT JOIN Employee E ON C.company_code = E.company_code
GROUP BY C.company_code, C.founder
ORDER BY C.company_code
  • 문제를 풀면서 왜 Employee 테이블은 나머지 계급 테이블이 가지고 있는 모든 정보를 가지고 있으며(Employee 테이블에서 founder 컬럼만 추가하면 위의 여러 개의 Join을 사용한 것과 동일한 결과다), Employee 테이블만 Company 테이블을 Join해서 사용하면 되지 않나 라는 생각을 함
  • '연속적인 Join'을 통해 해결하라는 문제의 의도가 있는 것 같았으나... 위의 방법으로도 해결됨
728x90