프로그래머스의 코딩테스트 연습에서 풀 수 있는 SQL문제 중 '조건에 맞는 사용자 정보 조회하기'문제의 풀이 및 해설입니다. 해당 문제는 레벨3 문제로 중간 난이도입니다.
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 내용 풀이
USED_GOODS_BOARD와 USER_GOODS_USER 테이블에서 완료된 중고 거래 총금액이 70만 원 이상인 사람의 회원 ID, 닉네임, 총거래금액을 조회하는 SQL문을 작성해주세요. 결과는 총거래금액을 기준으로 오름차순 정렬해주세요.
문제 내용으로 유추할 수 있는 바는 아래와 같습니다.
- 2개의 테이블을 사용한다 : JOIN문 사용
- 완료된 중고 거래의~ : 중고 거래 게시물 중 STATUS가 DONE인 물품만 WHERE절 사용
- 총 거래 금액이 70만원 이상인~ : 총 거래 금액은 GROUP BY 사용 후 도출되므로, HAVING절 사용
- 회원ID, 닉네임, 총거래금액을 조회하는 : SELECT로 도출해야할 컬럼으로, 회원ID와 닉네임별로 총거래금액을 조회해야 하므로 GROUP BY 사용
- 총거래금액을 기준으로 오름차순 정렬 : ORDER BY ASC 사용
정답 해설
SELECT U.USER_ID
, U.NICKNAME
, SUM(B.PRICE) AS TOTAL_SALES
FROM USED_GOODS_BOARD B
LEFT JOIN USED_GOODS_USER U ON B.WRITER_ID = U.USER_ID
WHERE B.STATUS = 'DONE'
GROUP BY U.USER_ID, U.NICKNAME
HAVING TOTAL_SALES >= 700000
ORDER BY 3 ASC
- 가장 먼저 사용할 테이블을 정리합니다. JOIN문을 활용해서 USED_GOODS_BOARD 테이블과 USED_GOODS_USER 테이블을 이어줍니다.
- 출력할 컬럼을 정리합니다. USER_ID와 NICKNAME은 USED_GOODS_USER 테이블에서 가져옵니다. PRICE는 USED_GOODS_BOARD에서 가져옵니다.
- 조건으로 필터링합니다. WHERE절을 통해 STATUS가 DONE인 데이터만 도출합니다.
- GROUP BY를 통해 USER_ID와 NICKNAME별로 PRICE의 합계, 측 총 거래 금액을 도출합니다. SELECT문에 PRICE를 SUM(PRICE)로 작성하고 TOTAL_SALES라는 별칭을 부여합니다.
- HAVING을 통해 총 거래 금액, TOTAL_SALES가 70만원 이상인 데이터만 필터링합니다.
- ORDER BY를 통해 3번 컬럼, 즉 TOTAL_SALES를 기준으로 ASC(오름차순)으로 정렬합니다.
코멘트
SQL의 각 문법에 대해 잘 숙지하고 있다면 쉽게 풀 수 있는 문제입니다. 다만 프로그래머스 내에서 테이블명이 문제 내에서 혼용되는 부분이 있었습니다. 맨 처음에 '문제 설명'부분에서 USED_GOODS_BOARD테이블과 USED_GOODS_FILE테이블이 존재한다고 언급하지만, USED_GOODS_FILE 테이블은 전혀 사용되지 않습니다. 이 부분에 유의해서 문제를 풀어야 합니다.
문제를 푸시던 도중 모르는 문법은 별도 구글링을 통해 간단하게 찾아보시고 직접 풀면서 해당 조건을 사용해보시는 것을 추천드립니다. 이외에 궁금하신 점 생기면 댓글 남겨주세요.