> 개발-IT-인터넷/> SQL

[해커랭크(HackerRank) SQL 풀이] - New Companies

jini:) 2023. 12. 22. 11:07
728x90
반응형
해커 랭크 - https://www.hackerrank.com/
Prepare > SQL > Advanced Select > New Companies

 

 

HackerRank - Online Coding Tests and Technical Interviews

HackerRank is the market-leading coding test and interview solution for hiring developers. Start hiring at the pace of innovation!

www.hackerrank.com

 

 

Amber의 다각화된 기업이 새로운 회사들을 인수했습니다. 각 회사는 다음과 같은 계층 구조를 따릅니다.

[출처] https://www.hackerrank.com/challenges/the-company/problem

 

아래의 테이블 스키마를 고려하여 company_code, 창업자 이름, 총 리드 매니저 수 총 시니어 매니저 수, 총 매니저 수, 총 직원수를 출력하는 쿼리를 작성하세요. company_code 기준으로 오름차순으로 출력되어야 합니다.

 

Note 

  • 테이블에 중복된 레코드가 있을 수 있습니다.
  • 회사 코드는 문자열 형태이므로 숫자로 정렬해서는 안됩니다. 예를 들어, 회사코드가 C_1, C_2, C_10인 경우, 오름차순으로 정렬된 회사 코드는 C_1, C_10, C_2가 됩니다.

 

Input Format

다음 테이블에는 회사 데이터가 포함되어 있습니다.

  • Company : company_code는 회사의 코드, founder는 회사의 창업자입니다.

[출처] https://www.hackerrank.com/challenges/the-company/problem

 

  • Lead_Manager : lead_manager_code는 리드 매니저의 코드, company_code는 근무 회사 코드입니다.

[출처] https://www.hackerrank.com/challenges/the-company/problem

 

  • Senior_Manager : senior_manager_code는 시니어 매니저의 코드, lead_manager_code는 시니어 매니저의 리드 매니저의 코드, company_code는 근무 회사 코드입니다.

[출처] https://www.hackerrank.com/challenges/the-company/problem

 

  • Manager : manager_code는 매니저 코드, senior_manager_code는 매니저의 시니어 매니저의 코드, lead_manager_code는 시니어 매니저의 리드 매니저 코드, company_code는 근무 회사 코드입니다.

[출처] https://www.hackerrank.com/challenges/the-company/problem

 

  • Employee : employee_code는 직원 코드, manager_code는 직원의 매니저의 코드, senior_manager_code는 매니저의 시니어 매니저 코드, leade_manager_code는 시니어 매니저의 리드 매니저 코드, company_code는 근무 회사 코드입니다.

[출처] https://www.hackerrank.com/challenges/the-company/problem

 

Sample Input

  • Company Table

[출처] https://www.hackerrank.com/challenges/the-company/problem

 

  • Lead_Manager Table

[출처] https://www.hackerrank.com/challenges/the-company/problem

 

  • Senior_Manager Table

[출처] https://www.hackerrank.com/challenges/the-company/problem

 

  • Manager Table

[출처] https://www.hackerrank.com/challenges/the-company/problem

 

  • Employee Table

[출처] https://www.hackerrank.com/challenges/the-company/problem

 

Sample Output

C1 Monika 1 2 1 2
C2 Samantha 1 1 2 2

 

Explanation

회사 C1에서 유일한 리드 매니저는 LM1입니다. LM1 아래에는 두 명의 시니어 매니저인 SM1과 SM2가 있습니다. SM1 아래에는 한 명의 매니저인 M1이 있습니다. M1 아래에는 두 명의 직원인 E1과 E2가 있습니다.

회사 C2에서 유일한 리드 매니저는 LM2입니다. LM2 아래에는 한 명의 시니어 매니저인 SM3이 있습니다. SM3 아래에는 두 명의 매니저인 M2와 M3이 있습니다. M2 아래에는 한 명의 직원인 E3가 있고, M3 아래에는 다른 한 명의 직원인 E4가 있습니다.

 

반응형

 

MySQL
SELECT  C.company_code,
        C.founder,
        COUNT(DISTINCT lead_manager_code),
        COUNT(DISTINCT senior_manager_code),
        COUNT(DISTINCT manager_code),
        COUNT(DISTINCT employee_code)
FROM    Employee E
LEFT JOIN Company C
        ON E.company_code = C.company_code
GROUP BY C.company_code, C.founder
ORDER BY C.company_code ASC;

 

Oracle
SELECT  C.company_code,
        C.founder,
        COUNT(DISTINCT lead_manager_code),
        COUNT(DISTINCT senior_manager_code),
        COUNT(DISTINCT manager_code),
        COUNT(DISTINCT employee_code)
FROM    Employee E
LEFT JOIN Company C
        ON E.company_code = C.company_code
GROUP BY C.company_code, C.founder
ORDER BY C.company_code ASC;

 

MS SQL Server
SELECT  C.company_code,
        C.founder,
        COUNT(DISTINCT lead_manager_code),
        COUNT(DISTINCT senior_manager_code),
        COUNT(DISTINCT manager_code),
        COUNT(DISTINCT employee_code)
FROM    Employee E
LEFT JOIN Company C
        ON E.company_code = C.company_code
GROUP BY C.company_code, C.founder
ORDER BY C.company_code ASC;

 

 


  • 모든 테이블을 다 JOIN 하려 했으나, Employee 테이블 구조 상 이미 다른 테이블의 정보가 다 포함되어 있다고 판단하여 Employee 테이블을 기준으로 쿼리 작성함.

 

  • LEFT JOIN
    • SQL에서 사용되는 조인(Join)의 유형 중 하나.
    • 왼쪽 테이블을 기준으로 오른쪽 테이블과 매칭하여 데이터를 가져온다.
    • 왼쪽 테이블에 있는 값이 오른쪽 테이블과 매칭되는 값이 없을 경우 NULL 반환.
    • ON 절로 두 테이블을 연결할 때 사용되는 조인 조건 지정.
SELECT	colName
FROM	myTable01 /* 왼쪽 테이블 */
LEFT JOIN myTable02  /* 오른쪽 테이블 */
	ON myTable01.colName = myTable02.colName;

 


 

 

개인 공부를 위한 포스팅입니다.
모든 번역, 코드는 완벽하지 않을 수 있습니다.

 

 

 

728x90
반응형