관리 메뉴

물 만날 물고기

[해커랭크/MYSQL] - (25) New Companies 본문

DB & SQL/해커랭크

[해커랭크/MYSQL] - (25) New Companies

Lung Fish 2023. 7. 5. 00:31

🔍 예상 검색어

더보기

# 물만날물고기

# SQL

# New Companies

# MYSQL

# HACKRRANK

# DB

# 해커랭크


해당 포스팅은 해커랭크 MYSQL "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

SELECT C.company_code, C.founder
, COUNT(DISTINCT L.lead_manager_code)
, COUNT(DISTINCT S.senior_manager_code)
, COUNT(DISTINCT M.manager_code)
, COUNT(DISTINCT E.employee_code)
FROM Company AS C
LEFT JOIN Lead_Manager AS L ON C.company_code = L.company_code
LEFT JOIN Senior_Manager AS S ON L.lead_manager_code = S.lead_manager_code
LEFT JOIN Manager AS M ON S.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 ASC;

 

▶ 다른 사람 정답 (1)

select c.company_code, c.founder, 
    count(distinct l.lead_manager_code), count(distinct s.senior_manager_code), 
    count(distinct m.manager_code),count(distinct e.employee_code) 
from Company c, Lead_Manager l, Senior_Manager s, Manager m, Employee e 
where c.company_code = l.company_code 
    and l.lead_manager_code=s.lead_manager_code 
    and s.senior_manager_code=m.senior_manager_code 
    and m.manager_code=e.manager_code 
group by c.company_code order by c.company_code;

 

▶ 다른 사람 정답 (2)

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, Lead_Manager lm, Senior_Manager sm, Manager m, Employee e
where c.company_code = lm.company_code
	and lm.lead_manager_code = sm.lead_manager_code
	and sm.senior_manager_code = m.senior_manager_code
	and m.manager_code = e.manager_code
group by c.company_code, c.founder
order by c.company_code

 

▶ 다른 사람 정답 (3)

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
    inner join employee e on e.company_code = c.company_code
group by c.company_code,c.founder
order by c.company_code;

 

▶ 총평

사실 이 문제는 다른 사람 정답 (3) 처럼 Employee 테이블만 join으로 연결해도 결과가 정답으로 출력되지만, 이렇게 할 경우 만약 Company 테이블에는 있지만 Employee에는 없는 company_code와 founder에 대한 결과를 출력할 수 없다는 문제가 있다. 왜냐면 Employee 항목들은 Null로 표시되더라도, 현재 Company 테이블 기준의 상태로 확인하고 싶을 수 있다는 점 때문이다. 

 

 COUNT(DISTINCT) 를 같이 사용하는 문법도 생소하기는 했지만 정석은 Company 테이블에 LEFT 조인으로 다른 테이블을 JOIN 시켜서 값을 구하는게 맞는 것 같다.!

 

 

 

 

▼ 참고자료

No. 내용 비고
1 [백문이불여일타] 데이터 분석을 위한 중급 SQL 문제풀이 | 학습 페이지 데이터리
2 - -
3 - -
4 - -
5 - -

▼ 복습/히스토리

더보기
No. 복습일 비고
1    
2    
3    
4    
5    

- 작성코드

--