꿈은 데이터분석가, 취미는 계획

[MY SQL] 전화번호 '-'기호 넣기 본문

SQL/sql문풀

[MY SQL] 전화번호 '-'기호 넣기

data_2080 2024. 4. 29. 19:35
728x90

출처: [프로그래머스 스쿨 - 코딩테스트 연습 - MY SQL 문제] :  그룹별 조건에 맞는 식당 목록 출력하기

링크: https://school.programmers.co.kr/learn/courses/30/lessons/164670

문제(일부):  리뷰가 3개 이상인 작성자 정보 조회하기


0. CONCAT, SUBSTRING 이해하기

CONCAT은 인수들을 연결하는 함수SUBSTRING(컬럼, 시작위치, 길이): 컬럼에서 시작위치부터 지정한 길이만큼 출력

1. 서브쿼리 활용하기

1) WITH절에서 리뷰를 3개 이상 남긴 ID를 선택
2) 메인쿼리에서 CONCAT_WS로 공백을 넣어 주소를 합침
    SUBSTRING으로 전화번호의 3 / 4 / 4자리를 추출하고 CONCAT으로 연결
3) WHERE절에서 서브쿼리로 리뷰가 3개 이상인 ID를 필터링

WITH CNT_REVIEW AS(
    SELECT WRITER_ID
            ,COUNT(WRITER_ID) CNT
    FROM USED_GOODS_BOARD
    GROUP BY WRITER_ID
    HAVING CNT>= 3 )
    
SELECT USER_ID
        ,NICKNAME
        ,CONCAT_WS(' ',CITY,STREET_ADDRESS1, STREET_ADDRESS2) AS 전체주소
        ,CONCAT(SUBSTRING(TLNO, 1, 3), '-', -- 앞자리 (010)
              SUBSTRING(TLNO, 4, 4), '-',   -- 가운데자리 (1234)
              SUBSTRING(TLNO, 8, 4)) AS 전화번호 -- 뒷자리 (5678)
FROM USED_GOODS_USER 
WHERE USER_ID IN (SELECT WRITER_ID FROM CNT_REVIEW) -- 리뷰 3개 이상인 아이디
ORDER BY USER_ID DESC

2. JOIN 활용하기

1) CONCAT과 SUBSTRING을 사용하는 점은 1번과 동일
2) 서브쿼리 대신 INNER JOIN을 사용

SELECT u.USER_ID
        , u.NICKNAME
        , CONCAT(u.CITY, ' ', u.STREET_ADDRESS1 , ' ',u.STREET_ADDRESS2) AS 전체주소
        , CONCAT(
            SUBSTRING(u.TLNO, 1, 3), "-",  -- 앞자리 (010)
            SUBSTRING(u.TLNO, 4, 4), "-",  -- 가운데자리 (1234)
            SUBSTRING(u.TLNO, 8)          -- 뒷자리 (5678)
        ) AS 전화번호
FROM USED_GOODS_BOARD AS b
    INNER JOIN USED_GOODS_USER AS u
            ON b.WRITER_ID = u.USER_ID
GROUP BY b.WRITER_ID
HAVING COUNT(b.WRITER_ID) >= 3
ORDER BY u.USER_ID DESC
728x90