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

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

jini:) 2023. 12. 12. 10:49
728x90
반응형
해커 랭크 - https://www.hackerrank.com/
Prepare > SQL > Advanced Select > Occupations

 

 

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

 

 

OCCUPATIONS 테이블에서 직업(Occupation) 열을 기준으로 이름(Name)을 알파벳 순으로 정렬하여 출력합니다.(Pivot)

각 직업에 해당하는 이름은 Doctor, Professor, Singer, Actor 순서대로 출력되어야 합니다.

Note : 만약 특정 직업에 해당하는 이름이 더 이상 없으면 NULL을 출력합니다.

 

Input Format

OCCUPATIONS 테이블은 다음과 같습니다.

[출처] https://www.hackerrank.com/challenges/occupations/problem

OCCUPATIONS 테이블에는 Doctor, Professor, Singer, Actor 값 중 하나만 포함됩니다.

 

Sample Input

[출처] https://www.hackerrank.com/challenges/occupations/problem

 

Sample Output

Jenny    Ashley     Meera  Jane
Samantha Christeen  Priya  Julia
NULL     Ketty      NULL   Maria

 

Explanation

  • 첫 번째 열은 알파벳 순으로 정렬된 Doctor Name 목록입니다.
  • 두 번째 열은 알파벳 순으로 정렬된 Professor Name 목록입니다.
  • 세 번째 열은 알파벳 순으로 정렬된 Singer Name 목록입니다.
  • 네 번째 열은 알파벳 순으로 정렬된 Actor Name 목록입니다.
  • 각 직업별로 최대 인원수보다 적은 이름을 가진 열의 빈 셀은 NULL 값으로 채워집니다.

 

반응형

 

MySQL
SELECT  
        MAX(CASE WHEN Occupation = 'Doctor' THEN Name END) AS Doctor,
        MAX(CASE WHEN Occupation = 'Professor' THEN Name END) AS Professor,
        MAX(CASE WHEN Occupation = 'Singer' THEN Name END) AS Singer,
        MAX(CASE WHEN Occupation = 'Actor' THEN Name END) AS Actor
FROM    (
         SELECT 
                ROW_NUMBER() OVER(PARTITION BY Occupation ORDER BY Name) AS RowNumber,
                Occupation,
                Name
         FROM   OCCUPATIONS
        ) AS tmpTable
GROUP BY RowNumber
ORDER BY RowNumber;

 

Oracle
SELECT
        MAX(CASE WHEN Occupation = 'Doctor' THEN Name END) AS Doctor,
        MAX(CASE WHEN Occupation = 'Professor' THEN Name END) AS Professor,
        MAX(CASE WHEN Occupation = 'Singer' THEN Name END) AS Singer,
        MAX(CASE WHEN Occupation = 'Actor' THEN Name END) AS Actor
FROM    (
         SELECT  ROW_NUMBER() OVER (PARTITION BY Occupation ORDER BY Name) AS RowNumber,
                 Occupation,
                 Name
         FROM    OCCUPATIONS
        )
GROUP BY RowNumber
ORDER BY MAX(RowNumber);

 

MS SQL Server
SELECT  Doctor, Professor, Singer, Actor
FROM    (
         SELECT ROW_NUMBER() OVER (PARTITION BY Occupation ORDER BY Name) RowNumber, * 
         FROM   OCCUPATIONS
        ) AS tmpTable
PIVOT   (
         MAX(Name) FOR Occupation IN (Doctor, Professor, Singer, Actor)
        ) as pivotTable

 

 


  • ROW_NUMBER()를 사용하여 같은 직업 내에서 이름을 기준으로 순서대로 나열할 수 있다.
  • PARTITION BY Occupation ORDER BY Name으로 Occupation 열의 값에 따라 여러 그룹으로 나누고, 그룹 내에서 Name을 기준으로 정렬한다.

 

  • MSSQL의 PIVOT
    • 행 데이터를 열로 변환하는 데 사용.
    • 주로 집계 함수와 함께 사용되어 테이블을 회전시켜 원하는 형태로 데이터 조회 가능.
    • 특정 열의 값들을 열이름으로 변환하고 그 값들에 따라 데이터를 집계하거나 그룹화함.
    • 열의 값이 유한하고 알려진 경우 매우 유용하게 사용.
SELECT	*
FROM	(
	 SELECT	Category, Count
	 FROM	MyTable
	) AS TmpTable
PIVOT	(
	 SUM(Count)
	 FOR Category IN ([Category1], [Category2]), [Category3])
	) AS PivotTable
  • MyTable은 실제 데이터가 있는 테이블
  • Category는 열 이름이 될 기준 열
  • Count는 각 Category에 따른 값
  • FOR Category IN ([Category1], [Category2], [Category3])은 PIVOT 할 열을 지정. 이 부분에 지정된 값들은 결과 테이블의 열 이름으로 사용.

 

 

 

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

 

 

728x90
반응형