[SQL] 164668 조건에 맞는 사용자와 총 거래금액 조회하기
https://school.programmers.co.kr/learn/courses/30/lessons/164668
📌문제
- 중고 거래 완료 상태(status = 'DONE')인 거래들 중
- 회원별 총 거래금액이 70만 원 이상인 회원의 ID, 닉네임, 총거래금액을 조회하기
- 총거래금액을 기준으로 오름차순 정렬
💡 정답 쿼리
-- 코드를 입력하세요
SELECT *
FROM (
SELECT USER_ID, NICKNAME, SUM(b.price) AS 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 user_id) sum
WHERE total_sales >= 700000
ORDER BY total_sales;
GROUP BY절에 USER_ID만 써도 되는 이유
원래 DBMS(특히 MySQL)는 SELECT
에 포함된 컬럼은 모두 GROUP BY
에 넣거나, 집계 함수 안에 넣어야 한다. 하지만 NICKNAME
이 USER_ID
와 1:1 대응해서 항상 같은 값이면 GROUP BY USER_ID
만 해도 오류가 안 나고 정상적으로 동작한다.
왜냐하면 USER_ID가 기본키거나 유일한 식별자이기 때문이다.
USER_ID
가 테이블에서 유일한 키라면, 이걸 기준으로 그룹핑하면 같은 USER_ID
에 대해 항상 하나의 NICKNAME
만 존재하게 된다. 따라서 굳이 NICKNAME
을 추가로 그룹핑하지 않아도 된다. 닉네임은 USER_ID
기준으로 유일하게 나오기 때문이다.
반면 닉네임이 USER_ID
와 1:1 대응이 확실하지 않거나, 닉네임이 바뀔 가능성이 있을 때는 NICKNAME도 별도로 GROUP BY절에 명시해주는 것이 좋다. 예를 들면 NICKNAME
이 USER_ID
별로 여러개인 경우, NICKNAME
까지 넣어야 그룹이 정확하게 나뉜다. 특히 복잡한 조인이나 다중 값 가능성이 있다면 닉네임까지 포함하는 게 안전하다.