본문 바로가기
HackerRank

Occupations(SQL)

by Doromi 2023. 10. 16.
728x90
반응형
 "OCCUPATIONS" 테이블에서 각 직업 별로 이름을 Pivot(회전)하여 출력해야 합니다. 출력된 결과는 각 직업에 해당하는 이름들을 알파벳 순으로 정렬하고, 출력 열 헤더는 "Doctor," "Professor," "Singer," 그리고 "Actor"로 나열되어야 합니다.

직업 (Occupation) 값은 "Doctor," "Professor," "Singer," 또는 "Actor" 중 하나의 값만을 가집니다. 각 직업은 여러 개의 이름 (Name)을 포함하고 있습니다.

예시:

입력:
+----------------+----------------------+
|  Occupation   |         Name         |
+----------------+----------------------+
| Doctor         | Jenny                |
| Doctor         | Samantha             |
| Professor      | Ashley               |
| Singer         | Meera                |
| Singer         | Christeen            |
| Singer         | Ketty                |
| Singer         | Jane                 |
| Actor          | Priya                |
| Actor          | Julia                |
| Actor          | Maria                |
+----------------+----------------------+

 

출력:
+--------+-----------+-------+--------+
| Doctor | Professor | Singer| Actor  |
+--------+-----------+-------+--------+
| Jenny  | Ashley    | Jane  | Julia  |
| Samantha| NULL     | Meera | Maria  |
| NULL   | NULL     | Christeen| Priya|
| NULL   | NULL     | Ketty | NULL   |
+--------+-----------+-------+--------+
"Doctor" 열은 "Doctor" 직업에 해당하는 이름들을 알파벳 순으로 정렬하고 출력합니다.
"Professor" 열은 "Professor" 직업에 해당하는 이름들을 알파벳 순으로 정렬하고 출력합니다. (NULL 값으로 채워진 열)
"Singer" 열은 "Singer" 직업에 해당하는 이름들을 알파벳 순으로 정렬하고 출력합니다.
"Actor" 열은 "Actor" 직업에 해당하는 이름들을 알파벳 순으로 정렬하고 출력합니다.
직업에 대응하는 이름이 부족한 경우 해당 열에는 NULL 값이 채워집니다.

이 문제를 해결하기 위해서는 SQL 쿼리를 작성하여 OCCUPATIONS 테이블을 Pivot하여 각 직업에 해당하는 이름을 출력해야 합니다. Pivot 작업을 수행하는 방법은 RDBMS에 따라 다를 수 있으며, 각 직업을 별도의 열로 변환하고 NULL 값을 처리하는 방법을 사용해야 합니다.

 

 

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 RowNum,
        Occupation, Name
    FROM OCCUPATIONS
) AS Temp
GROUP BY RowNum
ORDER BY RowNum;

 

이 SQL 쿼리는 "OCCUPATIONS" 테이블에서 직업을 Pivot하여 각 직업에 해당하는 이름을 출력하는 것을 수행합니다. 

쿼리는 MySQL에서 사용할 수 있는 방법 중 하나로, CASE 문과 GROUP BY를 사용하여 각 직업에 해당하는 이름을 알파벳 순으로 정렬하여 출력합니다.

쿼리를 단계별로 설명하겠습니다:

1.SELECT MAX(CASE WHEN Occupation = 'Doctor' THEN Name END) AS Doctor, ...: 

각 직업 (Doctor, Professor, Singer, Actor)에 대해 CASE 문을 사용하여 해당하는 이름을 선택합니다. 

MAX 함수를 사용하여 알파벳 순으로 가장 빠른 이름을 선택합니다.(이름 중에서 가장 빠른 알파벳순 이름을 선택하는 방법)

2.FROM (SELECT ROW_NUMBER() OVER (PARTITION BY Occupation ORDER BY Name) AS RowNum, Occupation, Name FROM OCCUPATIONS) AS Temp: 원래 테이블인 "OCCUPATIONS"에서 Occupation과 Name 열을 선택하고, ROW_NUMBER() 함수를 사용하여 각 직업 내에서 이름을 알파벳 순으로 순위를 매깁니다. 

PARTITION BY 구문은 직업 (Occupation) 별로 순위를 지정합니다.

예시: 

+--------+------------+-----------+
| RowNum | Occupation | Name      |
+--------+------------+-----------+
| 1      | Doctor     | Jenny     |
| 2      | Doctor     | Samantha  |
| 1      | Singer     | Christeen |
| 2      | Singer     | Meera     |
| 1      | Actor      | Julia     |
| 2      | Actor      | Priya     |
+--------+------------+-----------+



3.GROUP BY RowNum: RowNum을 기준으로 결과를 그룹화합니다. 이것은 각 직업에 대응하는 이름을 하나의 행으로 결합하는 데 사용됩니다.

4.ORDER BY RowNum: RowNum을 기준으로 결과를 정렬합니다. 이로써 알파벳 순으로 각 직업의 이름이 나열됩니다.

결과적으로 쿼리는 직업 열을 열 헤더로 Pivot하고, 각 직업에 대한 이름을 알파벳 순으로 출력합니다. 직업에 대응하는 이름이 부족한 경우 해당 열에는 NULL 값이 채워집니다.

728x90
반응형

'HackerRank' 카테고리의 다른 글

Average Population of Each Continent(SQL)  (0) 2023.10.19
African Cities(SQL)  (2) 2023.10.17
The PADS(SQL)  (0) 2023.10.16
Basic Join:Population Census  (1) 2023.10.15
Type of Triangle(SQL)  (1) 2023.10.14