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
💡
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;
💡💡💡
JOIN
했다.GROUP BY
한 것만 SELECT할 수 있다!COUNT
할 때는 DISTINCT
로 중복을 없애줬다.