해당 문제는 Programmers에서 사용한 문제이며 모든 테이블의 자료와 출처는 Programmers임을 밝힙니다.
해당 글에서는 CONCAT, MID을 이용하여 푸는 문제로 초보자가 하기에는 쉬움 정도의 난이도를 가지고 있는 것 같습니다.
해당 문제 원본을 확인 하시려면 해당 사이트를 들어가시면 될 것 같습니다.
시작하겠습니다.
USED_GOODS_BOARD와 USED_GOODS_USER 테이블에서 중고 거래 게시물을 3건 이상 등록한 사용자의 사용자 ID, 닉네임, 전체주소, 전화번호를 조회하는 SQL문을 작성해주세요. 이때, 전체 주소는 시, 도로명 주소, 상세 주소가 함께 출력되도록 해주시고, 전화번호의 경우 xxx-xxxx-xxxx 같은 형태로 하이픈 문자열(-)을 삽입하여 출력해주세요. 결과는 회원 ID를 기준으로 내림차순 정렬해주세요.
해당 문제는 MID를 통해 문자열에서 나눠줄 곳을 선정한 후 CONCAT을 이용하여 (-)을 연결 시켜주는 문제입니다.
MID('문자열', 시작위치, 몇 개 문자열 가져올 것인지) 이런 형태로 되어 있습니다.
만약 'apple' 문자열이 있고 'pp'만 가지고 오고 싶다면 MID('apple', 2, 2) 이렇게 해주면 됩니다.
즉, apple 문자열에서 두번째(p) 문자열부터 2개의 문자열을 가져오는 것입니다.
이를 참고하여 문제를 풀어보겠습니다.
1. 서브쿼리 이용해서 3건 이상 작성한 사용자들만 출력하
SELECT *
FROM USED_GOODS_USER b
JOIN
(SELECT WRITER_ID, COUNT(WRITER_ID) AS WRITE_COUNT
FROM USED_GOODS_BOARD
GROUP BY WRITER_ID) a ON a.WRITER_ID = b.USER_ID
WHERE a.WRITE_COUNT >= 3
위의 코드와 같이 3건 이상 작성한 사용자의 정보를 모두 가져왔습니다.
이제 사용자들의 ADDRESS를 모두 합쳐 주겠습니다.
2. 사용자들 주소 합치기
SELECT CONCAT(b.CITY, ' ', b.STREET_ADDRESS1, ' ', b.STREET_ADDRESS2) AS 전체주소
FROM USED_GOODS_USER b
JOIN
(SELECT WRITER_ID, COUNT(WRITER_ID) AS WRITE_COUNT
FROM USED_GOODS_BOARD
GROUP BY WRITER_ID) a ON a.WRITER_ID = b.USER_ID
WHERE a.WRITE_COUNT >= 3
이렇게 CONCAT을 통해 합쳐줍니다. 해당 문제에서는 각 컬럼 값 맨 앞에 띄움이 되어 있지 않기 때문에 무조건 ' '띄움을 해줘야 합니다. 안해주면 주소들이 모두 붙어 있게 되어 틀린 답이 되게 됩니다.
3. MID와 CONCAT을 사용하여 전화번호 출력하기
SELECT b.USER_ID
, b.NICKNAME
, CONCAT(b.CITY, ' ', b.STREET_ADDRESS1, ' ', b.STREET_ADDRESS2) AS 전체주소
, CONCAT(MID(b.TLNO, 1, 3), '-', MID(b.TLNO, 4, 4), '-', MID(b.TLNO, 8, 4)) AS 전화번호
FROM USED_GOODS_USER b
JOIN
(SELECT WRITER_ID, COUNT(WRITER_ID) AS WRITE_COUNT
FROM USED_GOODS_BOARD
GROUP BY WRITER_ID) a ON a.WRITER_ID = b.USER_ID
WHERE a.WRITE_COUNT >= 3
ORDER BY b.USER_ID DESC
위의 코드와 같이 MID를 사용하여 첫번째는 3글자 두번 째는 4글자 세번째는 4글자를 나눠 준 후 CONCAT을 사용하여 '-'하이픈을 추가한 후 합쳐줍니다.
그리고 조건에 맞게 정렬해주면 해당 코드는 정답이 됩니다.
이상으로 Programmers 문제 풀이를 마치도록 하겠습니다.
'Data Analyst > SQL' 카테고리의 다른 글
[SQL] HackerRank 문제 풀기 (Weather Observation Station 15) (1) | 2024.11.15 |
---|---|
[SQL] Programmers 문제 풀기(자동차 대여 기록 별 대여 금액 구하기) (1) | 2024.11.14 |
[SQL] Programmers 문제 풀기(5월 식품들의 총매출 조회하기) (0) | 2024.11.12 |
[SQL] Programmers 문제 풀기(상품을 구매한 회원 비율 구하기) (0) | 2024.11.11 |
[SQL] Programmers 문제 풀기(자동차 대여 기록에서 장기/단기 대여 구분하기) (1) | 2024.11.10 |