데이터 공부/SQL

[프로그래머스] 조건에 맞는 사용자 정보 조회하기 CONCAT_WS

민몽 2024. 10. 14. 00:54

📖 문제

 `USED_GOODS_BOARD`와 `USED_GOODS_USER` 테이블에서 중고 거래 게시물을 3건 이상 등록한 사용자의 사용자 ID, 닉네임, 전체주소, 전화번호를 조회하는 SQL문을 작성해주세요.

이때, 전체 주소는 시, 도로명 주소, 상세 주소가 함께 출력되도록 해주시고, 전화번호의 경우 xxx-xxxx-xxxx 같은 형태로 하이픈 문자열(-)을 삽입하여 출력해주세요. 결과는 회원 ID를 기준으로 내림차순 정렬해주세요.

 

🔗Link : https://school.programmers.co.kr/learn/courses/30/lessons/164670

👀 What I Learned

- SQL문으로 문자열 다루는 함수를 몰라서 어려웠다. 가로로 데이터를 합치는 법이라던지, 전화번호를 특정 형태로 출력하는 부분이 어려웠다. CONCAT()은 문자열을 합칠 때, CONCAT_WS()는 반복되는 구분자를 넣고 문자열을 합칠 수 있는 함수임을 배웠다. 

📖 풀이 과정

1. `USED_GOODS_BOARD`와 `USED_GOODS_USER` 테이블을 writer_id(= user_id)를 기준으로 JOIN

2.  GROUP BY, HAVING 절에서 writer_id를 기준으로 그룹화 & 3건 이상 등록한 사용자 정보만 추출

3. `CONCAT_WS(구분자, 문자열1, 문자열 2, ...)` 함수를 활용해 예시 결과에 맞게 문자열 병합

3-1. 전화번호의 경우 000-0000-0000의 형태이므로 SUBSTRING(문자열,시작위치,길이) 함수를 사용해 3개,4개,4개로 분할

4. user_id 기준으로 내림차순 정렬

-- 중고 거래 게시물을 3건 이상 등록한 사용자의 사용자 ID, 닉네임, 전체주소, 전화번호를 조회
SELECT
    user_id,
    nickname,
    CONCAT_WS(' ', city, street_address1, street_address2) AS '전체주소',
    CONCAT_WS('-',SUBSTRING(tnlo,1,3), SUBSTRING(tnlo,4,4),SUBSTRING(tnlo,8,4)) '전화번호'
FROM USED_GOODS_BOARD B
    JOIN USED_GOODS_USER u
    ON b.writer_id = u.user_id
GROUP BY b.writer_id
HAVING COUNT(board_id) >= 3
ORDER BY 1 DESC