본문 바로가기
문제풀이/SQL(My sql)

[문제풀이] Hacker Rank - Occupations

by kime2 2024. 6. 5.
출처

 

문제

Pivot the Occupation column in OCCUPATIONS so that each Name is sorted alphabetically and displayed underneath its corresponding Occupation. The output column headers should be Doctor, Professor, Singer, and Actor, respectively.

Note: Print NULL when there are no more names corresponding to an occupation.

문제에 대한 해석

  • Doctor, Professor, Singer,  Actor 순으로 컬럼 지정
  • 해당 직업에 포함된 이름 열로 알파벳순으로 나열
  • 빈곳은 NULL
  1. PIVOT : 행을 직업 종류 열에 순서 값에는 이름
  2. row_number :직업별로 이름의 순서를 작성
  3. PIVOT > caew when 통해 직업별 행과 값에 이름을 저장
  4. group by : row_number별로 그룹화


순서(생략) 직업1 직업1 직업3 직업4
1 이름 이름 이름 이름
2 이름 이름 이름 이름

풀이(MYSQL)

-- 오답
SELECT 
    CASE WHEN occupation = 'Doctor' THEN name END AS Doctor,
    CASE WHEN occupation = 'Professor' THEN name  END AS Professor,
    CASE WHEN occupation = 'Singer' THEN name  END AS Singer,
    CASE WHEN occupation = 'Actor' THEN name END  AS Actor 
FROM OCCUPATIONS

-- 정답
WITH tmp AS (
    SELECT  name, occupation, ROW_NUMBER() OVER(PARTITION BY occupation order by name) as rn
    FROM OCCUPATIONS
)
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 tmp
GROUP BY rn
 오답 정답



첫행부터 이름이 있아야 함

 

작동순서

💡SQL 실행 순서는 From -> Where -> Group by -> Having -> Select -> Order by ->결과반환

 

  1. with 절: OCCUPATIONS 테이블에서
    • name, occupation과 occupation별로 name의 순서를 작성(컬럼명 rn)하여 조회

    •  

  2. GROUP BY 절: rn을 기준으로 그룹화 > actor에서 1번,doctor 1번, professor1번 끼리 그룹화
  3. SELECT 절: occupation 에서 'Doctor'일 경우 NAME조회, occupation 에서 ' Professor'일 경우 NAME조회, occupation 에서 ' Singer'일 경우 NAME조회, occupation 에서 ' Actor'일 경우 NAME조회

* 집계함수를 사용하지 않을 경우 그룹화가 불가능하므로, MAX함수(의미X) 사용

그룹화 하지 않은 경우 순서에 따른 그룹화

다른사람 풀이

https://techblog-history-younghunjo1.tistory.com/159

 

[SQL] CASE WHEN으로 Pivot Table 만들기(HackerRank - Occupations 문제)

🔊 본 포스팅에서 사용되는 테이블의 자료와 출처는 HackerRank 임을 밝힙니다. 더 다양한 SQL 문제를 풀어보시려면HackerRank 사이트를 방문해 보세요! 이번 포스팅에서는 MySQL의 CASE WHEN 구문으로 Pivo

techblog-history-younghunjo1.tistory.com

 

배운점

1) ROW_NUMBER() : PARTITION BY 절을 사용하여 그룹화된 데이터에 대해 각 그룹별로 순차적인 번호를 부여

2) 사용자변수는 아직 어렵다..