Mo!
(HackerRank) 해커랭크 SQL [The PADS] Oracle 풀이 본문
SQL

(HackerRank) 해커랭크 SQL [The PADS] Oracle 풀이

5사 2021. 12. 6.

문제 링크

https://www.hackerrank.com/challenges/the-pads/problem?isFullScreen=true 

 

The PADS | HackerRank

Query the name and abbreviated occupation for each person in OCCUPATIONS.

www.hackerrank.com

1. 알파벳 순으로 정렬된 OCCUPATIONS의 모든 이름 목록을 쿼리한 다음 각 직업의 첫 번째 글자를 괄호로 묶어서 표시한다.
예: AnActorName(A), ADoxtorName(D), AProfessorName(P) 및 ASingerName(S)이 있습니다.
2. OCCUPATIONS에서 각 직업의 발생 횟수를 쿼리합니다.
발생 횟수를 오름차순으로 정렬하고 다음 형식으로 출력하십시오.

There are a total of [occupation_count] [occupation]s.

여기서 [operation_count]는 OCCUPATIONS에서 발생한 직업의 횟수이고 [operation]은 소문자 직업 이름입니다. 둘 이상의 직업이 동일한 [occation_count]을 가진 경우 알파벳 순으로 정렬해야 합니다.

 

 

연결 연산자(||)와 SUBSTR()을 사용한 풀이

 

substr(occupation, 1, 1)

-- 먼저 이름과 이름 뒤에 직업의 첫 글자를 괄호 안에 출력하기 위하여 SUBSTR을 사용한다

-- SUBSTR을 사용하여 직업의 첫 글자를 뽑는다

 

select name || '(' || substr(occupation, 1, 1) || ')'

-- 연결 연산자(||)를 사용하여 이름(직업의첫글자)가 출력될 수 있도록 한다

 

order by name

-- 이름이 알파벳순으로 나오도록 정렬한다

 

group by occupation
order by count(*), occupation

-- 밑의 결과를 출력하기 위해서는 먼저 직업별로 그룹을 만들어야 직업별로 몇 번 나오는지를 알 수 있다

-- 직업별로 나오는 횟수를 오름차순, 그리고 동일한 횟수일 경우 직업명의 알파벳순으로 나오도록 정렬한다

 

select 'There are a total of ' || count(*) || ' ' || lower(occupation) || 's.'

-- 연결연산자(||)를 사용하여 문장으로 출력될 수 있도록 만든다

-- 문제에서 소문자로 직업을 출력하라고 하였으니 lower을 써서 소문자로 변환한다

 

 

** 두 쿼리를 합하여(union 또는 union all을 사용하여) 출력해야 하는 줄 알았는데 따로 출력되게 해도 답으로 인정하는 듯하다

 

union all을 사용할 풀이 (union을 써도 두 쿼리가 교집합이 없기 때문에 동일하게 출력된다)

 

 

Comments