New Companies

hyeh·2022년 8월 9일
0

알고리즘 문제풀이

목록 보기
5/15

New Companies

Given the table schemas below, write a query to print the company_code, founder 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, Lead_Manager, Senior_Manager, Manager, Employee 테이블에서 company_code와 founder 별 총 매니저들과 직원의 수를 출력하는 문제다.

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 1, 2
ORDER BY 1

💡

  • employee 테이블에 모든 정보가 다 있는 것 같지만 필요한 값들이 다 들어있지 않다. (예를 들어, senior_manager_code 2번이 없음!)
  • LEFT JOIN으로 NULL 값이 있어도 다 가져올 수 있게 한다.
  • 하이어라키 구조에 따라서 내려온다!
  • GROUP BY 할 때 SELECT 절에 쓴 순서대로 1, 2 등으로 가져와서 사용할 수 있다.

💡💡
TIP. 여러 개 테이블 연결할 땐 어떤 조인을 사용할 지 생각해야 한다
1) INNER JOIN : 칼럼의 공통된 부분만 갖고 싶다
2) LEFT JOIN : 겹치는 게 없는 부분도 가져오고 싶다 -> 하이어라키가 있을 때에는 기준이 되는, 가장 상위의 테이블부터 LEFT JOIN을 해야 제대로 연결이 된다.


나의 오답!

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 employee e JOIN company c
    ON e.company_code = c.company_code
GROUP BY c.company_code, c.founder
ORDER BY c.company_code;

💡💡💡

  • 테이블 정보를 보니 employee 테이블에 founder 정보 빼고 다 있기 때문에 employee 테이블과 company 테이블을 JOIN했다.
  • 그리고 company_code와 founder 별로 각 숫자를 출력해야하므로 이 둘로 그룹화했다. GROUP BY한 것만 SELECT할 수 있다!
  • COUNT할 때는 DISTINCT로 중복을 없애줬다.
profile
좌충우돌 천방지축 룰루랄라 데이터 공부

0개의 댓글