본문 바로가기

코딩테스트_SQL

250404 프로그래머스 조건에 맞는 사용자와 총 거래금액 조회하기

[문제]

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