SQL/HackerRank(해커랭크)

HackerRank(해커랭크) MySQL New Companies 문제 답

진리뷰 2023. 10. 18. 09:00
반응형

 

 

HackerRank(해커랭크)-MySQL-New-Companies-문제-답-썸네일
New Companies 문제 답

 

 

*MySQL 버전, advanced select 문제입니다.

 

 

 

해커랭크 New Companies 문제, 샘플, 설명

 

💡 회사코드, 창립자명, 리드 매니저 총 인원, 시니어 매니저 총 인원, 매니저 총 인원, 총 직원(employee) 수 구하기

  • 리드 매니저 = LM, 시니어 매니저 = SM, 매니저 = M, 직원 E

 

💡 회사코드 오름차순 정렬

 

💡 유의점

  • 중복 레코드 존재 가능
  • 회사코드 컬럼은 string 타입(문자형). 즉, 숫자로 분류 불가하므로 정렬 시 유의

 

 

해커랭크-Newcompaines-문제
New Companies 문제

 

 

테이블은 총 5개이다.

  • Company, Lead_Manager, Senior_Manager, Manager, Employee
  • 모든 테이블의 컬럼은 String 타입
  • company_code가 공통키인 듯하다.

 

해커랭크-Newcompaines-샘플
New Companies 문제 테이블들

 

 

 

해커랭크 New Companies 답

 

  • 스칼라 서브쿼리

스칼라는 결괏값이 오직 1개이다. 즉 하나만 처리하므로, 여러 개 입력하면 에러 발생한다.

회사코드, 창립자명, 리드 매니저 총 인원, 시니어 매니저 총 인원, 매니저 총 인원, 총 직원 수는 모두 하나의 값만 처리된 결과이기에 스칼라 사용 가능하다.

  • 가독성 위해 별칭 사용
  • 중복 데이터의 존재 가능성 때문에  DISTINCT 사용
SELECT DISTINCT c.company_code
, founder

, (SELECT COUNT(DISTINCT lead_manager_code)
FROM lead_manger l
WHERE c.company_code = l.company_code)

, (SELECT COUNT(DISTINCT senior_manager_code)
FROM senior_manger s
WHERE c.company_code = s.company_code)

, (SELECT COUNT(DISTINCT manager_code)
FROM manger m
WHERE c.company_code = m.company_code)

, (SELECT COUNT(DISTINCT employee_code)
FROM employee e
WHERE c.company_code = e.company_code)

FROM compnay c
ORDER BY 1;

 

 

 

추가 정리

 

위랑 유사하지만 서브 쿼리 안 쓴 방식

SELECT c.company_code
, founder
, COUNT(DISTINCT lead_manager_code)
, COUNT(DISTINCT senior_manager_code)
, COUNT(DISTINCT manager_code)
, COUNT(DISTINCT employee_code)

FROM compnay c, lead_manger l, senior_manger s, manger m, employee e

WHERE c.company_code = l.company_code
AND c.company_code = s.company_code
AND c.company_code = m.company_code
AND c.company_code = e.company_code

GROUP BY 1, 2
ORDER BY 1;

 

JOIN 방식

*추천 글 MySQL INNER JOIN(내부 조인) 다양한 문법과 예시

SELECT c.company_code
, founder
, COUNT(DISTINCT lead_manager_code)
, COUNT(DISTINCT senior_manager_code)
, COUNT(DISTINCT manager_code)
, COUNT(DISTINCT employee_code)

FROM company c

JOIN lead_manger l ON c.company_code = l.company_code
JOIN senior_manger s ON c.company_code = s.company_code
JOIN manager ON c.company_code = m.company_code
JOIN employee ON c.company_code = e.company_code

GROUP BY 1, 2
ORDER BY 1;
 
반응형
top