728x90
반응형
해커 랭크 - https://www.hackerrank.com/
Prepare > SQL > Advanced Select > Occupations
OCCUPATIONS 테이블에서 직업(Occupation) 열을 기준으로 이름(Name)을 알파벳 순으로 정렬하여 출력합니다.(Pivot)
각 직업에 해당하는 이름은 Doctor, Professor, Singer, Actor 순서대로 출력되어야 합니다.
Note : 만약 특정 직업에 해당하는 이름이 더 이상 없으면 NULL을 출력합니다.
Input Format
OCCUPATIONS 테이블은 다음과 같습니다.
OCCUPATIONS 테이블에는 Doctor, Professor, Singer, Actor 값 중 하나만 포함됩니다.
Sample Input
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
반응형
'> 개발-IT-인터넷 > > SQL' 카테고리의 다른 글
[해커랭크(HackerRank) SQL 풀이] - New Companies (0) | 2023.12.22 |
---|---|
[해커랭크(HackerRank) SQL 풀이] - Binary Tree Nodes (1) | 2023.12.20 |
[해커랭크(HackerRank) SQL 풀이] - The PADS (2) | 2023.12.07 |
[해커랭크(HackerRank) SQL 풀이] - Type of Triangle (0) | 2023.11.30 |
[해커랭크(HackerRank) SQL 풀이] - Employee Salaries (0) | 2023.11.28 |