본문 바로가기
SQL/코딩테스트

[MySQL] INNER JOIN과 LEFT JOIN 쓰임 / COUNT(DISTINCT)

by Nanki 2024. 11. 7.

문제는 아래 내용을 참고 바란다.

문제 출처 : https://www.hackerrank.com/challenges/the-company/problem

 

New Companies | HackerRank

Find total number of employees.

www.hackerrank.com

 

풀이 매크로

1. 예시와 문제를 보고 어떻게 풀이할 것인지 고민 : 출력해야할 SELECT 문/ SAMPLE OUTPUT 이 나오는 과정

> company_code와 founder를 GROUP BY로 하고 리드 매니저 총 수 , 시니어 매니저 총 수 , 매니저 총 수 , 직원 총 수를 구해야 하며, 중복 값이 있으므로 COUNT 전에 DISTINCT를 해줘야 겠구나

 

2. 여러 테이블들 존재 > 어떻게 JOIN 할 것인가?

 *A  INNER JOIN B : JOIN 하려는 변수의 값을 테이블 둘다 가지고 있을 때 활용.  
 *A LEFT JOIN B : JOIN 하려는 변수의 값에 대한 A 테이블의 정보가 B 테이블 정보보다 많을 경우에 활용
>  A가 매니저 테이블이고 B가 직원테이블일때, 직원이 없는 매니저도 있을 것이므로 LEFT JOIN을 사용해야 한다.

 

3. 정렬은 어떻게 하는가? 

> company_code기준으로 오름차순 정렬

 

완성 코드

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 LM.lead_manager_code = SM.lead_manager_code
    LEFT JOIN Manager AS M ON SM.Senior_Manager_code = M.Senior_Manager_code
    LEFT JOIN employee AS e ON M.manager_code = e.manager_code
GROUP BY c.company_code, c.founder
ORDER BY c.company_code

 

배운 점

1. LEFT JOIN과 INNER JOIN을 어떻게 활용해야 하는가?

2. LEFT JOIN 시, 하나의 테이블에 여러 테이블을 교차로 붙일 수 있음

3. COUNT안에 DISTINCT를 넣으면 중복값을 제거한 값들에 대한 수를 셀 수 있음