Skillset/SQL

SQL로 깔끔한 문장 출력하기 (CONCAT 활용)

Everly. 2022. 8. 10. 10:11

SQL을 사용하다 보면 보통은 숫자값을 집계하는 경우가 많은데, SQL의 좋은 점은 문자를 활용해서 깔끔한 형태의 문장을 만들 수도 있다는 점이다.

문제를 바로 풀어보자. (문제 바로가기)

 

'OCCUPATIONS' 테이블

 

오늘 활용할 테이블 'OCCUPATIONS'이다. 이 테이블의 경우 사람의 이름과, 그 사람의 직업이 적힌 간단한 데이터셋이다.

이 테이블을 활용해 다음과 같은 문장을 만들어보고자 한다.

 

  1. 첫 번째로는 사람 이름 옆에 그 사람의 직업의 이니셜을 괄호로 붙여 출력하고 싶다.
    예를 들어, 이름은 'Everly' 이고, 직업은 'Data Scientist'라면 "Everly(D)" 로 출력한다.
    (단, 순서는 이름 알파벳순으로 한다.)
  2. 두 번째로는 각 직업에 해당하는 사람 수가 몇 명인지 세어 문장 형태로 출력하고 싶다.
    예를 들어, Actors는 4명, Singer는 7명이라면 
    "There are a total of 4 actors.", "There are a total of 7 singers" 라고 출력한다.
    (단, 순서는 사람 수가 작은 순서대로 하며, 사람 수가 동일한 경우 직업 이름 알파벳순으로 한다. 직업 이름은 소문자로 쓴다.)

 

다음과 같이 말이다.

 

 


SQL 쿼리 답안

먼저 첫 번째 문장부터 만들어보자. 이 경우 이름(NAME)과, 직업(OCCUPATION) 열의 첫 이니셜을 가져와서 괄호로 묶어야 한다.

이렇게 문자열을 합칠 경우엔 CONCAT 이라는 SQL 함수를 사용하면 좋다. (다양한 SQL 함수 설명 바로가기)

 

-- 예를 들어 '대한민국만세'를 출력하고자 한다면
SELECT CONCAT('대한', '민국', '만세')

 

CONCAT은 공백없이 붙여주기 때문에 공백을 만들어주고 싶다면 ' ' 와 같이 공백을 함께 써줘야 한다.

아무튼 문제를 풀어보면 다음과 같이 쿼리를 짤 수 있을것이다.

 

SELECT CONCAT(NAME, '(', LEFT(OCCUPATION, 1), ')')
FROM OCCUPATIONS
ORDER BY NAME;

 


이번엔 두 번째 문장을 만들어보자. 이 문장의 경우엔 다음과 같은 형식으로 문장을 출력해야 한다고 했다.

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

 

CONCAT을 활용하면 'There are a total of ' 라는 문장과, "직업에 해당하는 사람 수", "직업명" 마지막으로 's.' 를 붙이면 된다.

그리고 직업에 해당하는 사람 수는 테이블에서 직업의 개수를 세면 된다. 

직업명은 반드시 소문자로 하라고 했으므로 LOWER 함수를 사용한다. 

 

SELECT CONCAT('There are a total of ', COUNT(OCCUPATION), ' ', LOWER(OCCUPATION), 's.')
FROM OCCUPATIONS
GROUP BY OCCUPATION
ORDER BY COUNT(OCCUPATION), OCCUPATION;

 

위와 같은 쿼리를 만들면 깔끔한 문장 형태로 출력될 것이다.

단 주의점은 GROUP BY를 써야 한다는 것인데, COUNT라는 집계함수를 사용했으므로 OCCUPATION에 대해 그룹화를 시켜주어야 한다. 

마지막으로 사람 수가 작은 순서대로, 그리고 직업명 알파벳 순서대로 정렬한다.

 


위의 두 쿼리문을 한 번에 실행하면 원하는 결과 완성!

 

SELECT CONCAT(NAME, '(', LEFT(OCCUPATION, 1), ')')
FROM OCCUPATIONS
ORDER BY NAME;

SELECT CONCAT('There are a total of ', COUNT(OCCUPATION), ' ', LOWER(OCCUPATION), 's.')
FROM OCCUPATIONS
GROUP BY OCCUPATION
ORDER BY COUNT(OCCUPATION), OCCUPATION;

결과

반응형