[문제]
USED_GOODS_BOARD와 USED_GOODS_USER 테이블에서 완료된 중고 거래의 총금액이 70만 원 이상인 사람의 회원 ID, 닉네임, 총거래금액을 조회하는 SQL문을 작성해주세요. 결과는 총거래금액을 기준으로 오름차순 정렬해주세요.
[풀이]
1) 회원ID(BOARD 테이블에서는 WRITER_ID, USER 테이블에서는 USER_ID), NICKNAME, SUM(BOARD 테이블의 PRICE) 조회
2) 총거래금액은 TOTAL_SALES로 별칭
3) USED_GOODS_BOARD 테이블과 USED_GOODS_USER 테이블 조인 (회원ID로 연결)
4) USED_GOODS_BOARD 테이블의 STATUS 값 파악 후(SALE, DONE, RESERVED), 문제에 해당하는 값으로 조건 필터링
5) 회원별 총거래금액이므로 회원ID 기준으로 그룹화
6) 그룹화를 하되, 총거래금액이 70만원 이상인 데이터로 필터링
7) 총거래금액 기준으로 오름차순 정렬하기
[오답 분석하기]
1) 총거래금액 그룹화 및 조건 필터링 순서 혼동
- (O) 올바른 SQL
..
WHERE B.STATUS = 'DONE'
GROUP BY B.WRITER_ID
HAVING SUM(B.PRICE) >= 700000
..
- (X) 오류 발생 SQL
(X)
..
WHERE B.STATUS = 'DONE' AND SUM(B.PRICE) >= 700000
GROUP BY B.WRITER_ID
..
** SQL의 실행 순서: FROM 및 JOIN > WHERE > GROUP BY > HAVING > SELECT > ORDER BY > LIMIT
- WHERE 절은 그룹화 이전 단계에서 행 단위 조건 필터링
- SUM()은 집계 함수이기 때문에 GROUP BY 이후에야 계산 가능
-> WHERE절에서 SUM()을 사용하는것이 불가하기 때문에 SQL 구문 오류(Syntax Error) 발생한다.
=> 따라서, 집계함수 조건은 HAVING 절에서 처리해야 한다.
* HAVING은 그룹화 이후 그룹 단위 필터링 담당 *
[정답]
SELECT B.WRITER_ID, U.NICKNAME
, SUM(B.PRICE) TOTAL_SALES
FROM USED_GOODS_BOARD B JOIN USED_GOODS_USER U
ON B.WRITER_ID = U.USER_ID
WHERE B.STATUS = 'DONE'
GROUP BY B.WRITER_ID
HAVING SUM(B.PRICE) >= 700000
ORDER BY 3;
# STATUS=SALE, DONE, RESERVED
'코딩테스트_SQL' 카테고리의 다른 글
250406 프로그래머스 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기 (0) | 2025.04.06 |
---|---|
250405 프로그래머스 오랜 기간 보호한 동물(1) (0) | 2025.04.06 |
250403 프로그래머스 카테고리 별 도서 판매량 집계하기 (0) | 2025.04.04 |
250327 프로그래머스 연도 별 평균 미세먼지 농도 조회하기 (0) | 2025.03.27 |
250327 프로그래머스 조건에 맞는 아이템들의 가격의 총합 구하기 (0) | 2025.03.27 |