-
<프로그래머스> 조건에 맞는 사용자 정보 조회하기코딩테스트/SQL 코딩테스트 2023. 12. 21. 22:25
출처 : https://school.programmers.co.kr/learn/courses/30/lessons/164670
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
- 문제 요구사항
- USED_GOODS_BOARD(중고 거래 게시판)과 USER_GOODS_USER(중고 거래 유저) 테이블에서
- 중고 거래 게시물을 3건 이상 등록한 사용자의 사용자 ID, 닉네임, 전체주소, 전화번호를 조회
우선 두 테이블을 INNER JOIN한다
그리고 WHERE 조건으로 USER_ID 기준으로 GROUP BY를 했을 때 COUNT(*)가 3개를 넘어가는(HAVING이용) USER_ID를 찾는 조건을 두기 위해서 WHERE 절에 서브쿼리를 작성한다.
그리고 전체 주소를 이어 붙이기 위해 주소에 해당하는 칼럼들을 모두 조회하고 전화번호 사이에 하이픈을 집어넣기 위해서 전화번호를 앞3자리, 중간4자리, 뒷4자리를 잘라서 별도로 조회한뒤 이 모든 조회를 서브쿼리로 또 묶는다
그 다음 조회된 서브쿼리를 테이블로 하여 사용자 ID, 닉네임을 조회하고
주소와 전화번호 데이터를 붙이기 위해 CONCAT_WS()함수를 사용한다.
CONCAT()은 그냥 단순하게 문자열을 붙이지만 CONCAT_WS()는 사이에 구분자를 집어넣어준다
CONCAT_WS('구분자', A, B) -> A구분자B
주소 사이에는 공백을 구분자로 넣고, 전화번호는 하이픈을 구분자로 넣으면 문제를 해결 할 수 있다.
1) Oracle
오라클은 에러가 나서 문제를 풀지 못했다... 이 부분은 꼭 해결하고 다시 수정하러 올 것이다.
# 에러 코드 SELECT USER_ID, NICKNAME, CONCAT_WS(' ', CITY, STREET_ADDRESS1, STREET_ADDRESS2) AS '전체주소', CONCAT_WS('-', FIRST3, MIDDLE4, FINAL4) AS '전화번호' FROM ( SELECT U.USER_ID, U.NICKNAME, U.CITY, U.STREET_ADDRESS1, U.STREET_ADDRESS2, SUBSTR(U.TLNO, 1, 3) FIRST3, SUBSTR(U.TLNO, 4, 4) MIDDLE4, SUBSTR(U.TLNO, 8, 4) FINAL4 FROM USED_GOODS_BOARD B INNER JOIN USED_GOODS_USER U ON B.WRITER_ID = U.USER_ID WHERE U.USER_ID IN (SELECT U.USER_ID FROM USED_GOODS_BOARD B INNER JOIN USED_GOODS_USER U ON B.WRITER_ID = U.USER_ID GROUP BY U.USER_ID HAVING COUNT(*)>=3) GROUP BY U.USER_ID ) A ORDER BY USER_ID DESC;
에러코드는 위와 같다. MySQL이랑 생긴거는 똑같은데
ORA-00923: FROM keyword not found where expected 이 에러가 난다
SELECT와 FROM 사이에 ,를 안찍었다던가 하는 식의 단순한 에러인걸로 알고 있는데
왜 이 에러가 나는지 이해를 못했다..
2) MySQL
SELECT USER_ID, NICKNAME, CONCAT_WS(' ', CITY, STREET_ADDRESS1, STREET_ADDRESS2) AS '전체주소', CONCAT_WS('-', FIRST3, MIDDLE4, FINAL4) AS '전화번호' FROM ( SELECT U.USER_ID, U.NICKNAME, U.CITY, U.STREET_ADDRESS1, U.STREET_ADDRESS2, SUBSTR(U.TLNO, 1, 3) FIRST3, SUBSTR(U.TLNO, 4, 4) MIDDLE4, SUBSTR(U.TLNO, 8, 4) FINAL4 FROM USED_GOODS_BOARD B INNER JOIN USED_GOODS_USER U ON B.WRITER_ID = U.USER_ID WHERE USER_ID IN (SELECT U.USER_ID FROM USED_GOODS_BOARD B INNER JOIN USED_GOODS_USER U ON B.WRITER_ID = U.USER_ID GROUP BY 1 HAVING COUNT(*)>=3) GROUP BY 1 ) A ORDER BY 1 DESC;
'코딩테스트 > SQL 코딩테스트' 카테고리의 다른 글
<프로그래머스> 특정 옵션이 포함된 자동차 리스트 구하기 (0) 2023.12.22 <프로그래머스> 자동차 대여 기록에서 장기/단기 대여 구분하기 (1) 2023.12.22 <프로그래머스> 재구매가 일어난 상품과 회원 리스트 구하기 (0) 2023.12.21 <프로그래머스> 과일로 만든 아이스크림 고르기 (2) 2023.12.21 <프로그래머스> 없어진 기록 찾기 (1) 2023.12.21 - 문제 요구사항