[SQL Runday] HackerRank - New Companies

Lana Chung·2022년 4월 6일
0

SQLRunday

목록 보기
3/16
post-thumbnail
post-custom-banner

Advanced Select

  • 회사 위계 구조
    Founder(설립자) > Lead Manager > Senior Manager(선임 관리자) > Manager(관리자) > Employee(직원)
  • [Company_code, founder name, lead manager 총 인원 수, senior manager 총 인원 수, manager 총 인원 수, employee 총 인원수] 를 출력하는 쿼리를 작성해라.
  • company_code 기준으로 오름차순 정렬해라.

유의할 점)
1. 중복 레코드를 포함하고 있음.
2. company_code는 문자열이므로, 숫자순으로 정렬해서는 안됨. 예를 들어 C_1, C_2, C_10 이렇게 있다면 C_1, C_10, C_2 이렇게 정렬해야 한다.


Key Points

  1. 여러 테이블들을 company_code라는 동일한 외래키를 사용하여LEFT JOIN을 통해 조회 해야 함
    • 헷갈렸던 부분 : 처음엔 Inner Join을 통해서 조회했는데, left join이어야 맞음. SM 테이블에 값이 없더라도 C 테이블 중심으로 조회되어야 함.
    • 데이터를 Join할 때, 왼쪽 테이블에 있는 데이터가 오른쪽 테이블에 없을때 어떤 결과가 조회되어야 하는지 생각하면서 LEFT JOIN인지, INNER JOIN인지 판단해야 한다.
      • 이 경우 Company 테이블에 C_999란 코드 값이 있는데 LM 테이블엔 없더라도, C_999란 값이 조회되어야 하므로 LEFT JOIN이 맞다.
  2. COUNT(DISTINT ) 에 대한 사용
    • distinct를 어떻게 써야 되나 고민하다가 그냥 COUNT(DISTINCT 원하는 칼럼)하면 해당 칼럼을 중복 없이 세기 때문에, 그 그룹의 갯수가 자연스럽게 구해지는 걸 괜히 어렵게 생각함.

Errors

  1. select c.company_code, c.founder 부분에서 group by에 c.company_code만 써줄 경우 자꾸 다음 에러가 발생함.
ERROR 1055 (42000) at line 1: Expression #2 of SELECT list is not
in GROUP BY clause and contains nonaggregated column 
'run_ndb7mrwglbl.c.founder' which is not functionally dependent 
on columns in GROUP BY clause; this is incompatible with 
sql_mode=only_full_group_by
  • c.founder는 GROUP BY절과 기능적으로 독립적이지 않기 때문에!
  • select 할 부분을 group by에 동시에 써줘야 함.
    • 왜냐면 조회할 때 해당 칼럼도 같이 가져오려면, 그 칼럼 기준으로도 그룹바이를 해줘야 하기 때문에.. 음.. 그렇다.

select c.company_code, c.founder, 
    count(distinct lm.lead_manager_code),
    count(distinct sm.senior_manager_code),
    count(distinct mg.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.company_code = sm.company_code
left join Manager mg on sm.company_code = mg.company_code
left join Employee e on mg.company_code = e.company_code
group by c.company_code, c.founder
order by c.company_code

오늘의 교훈. 너무 어렵게 꼬와서 생각하지 말고, 쉽게 생각하자!
그리고 해커랭크 서버.. sql 서버 특히나 너무 느리다.
난 계속 조회해가면서 결과 확인하면서 하는걸 좋아하는데..
이거 DB만 그대로 가져와서 DBeaver에서 하고 싶음 ㅜㅜ

profile
그게 쉬운 일이었다면, 아무런 즐거움도 얻을 수 없었을 것이다.
post-custom-banner

0개의 댓글