Skip to main content

[SQL] 164668 조건에 맞는 사용자와 총 거래금액 조회하기

https://school.programmers.co.kr/learn/courses/30/lessons/164668

image.png

image.png

image.png

📌문제

  • 중고 거래 완료 상태(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에 넣거나, 집계 함수 안에 넣어야 한다. 하지만 NICKNAMEUSER_ID와 1:1 대응해서 항상 같은 값이면 GROUP BY USER_ID만 해도 오류가 안 나고 정상적으로 동작한다.

왜냐하면 USER_ID가 기본키거나 유일한 식별자이기 때문이다.

USER_ID가 테이블에서 유일한 키라면, 이걸 기준으로 그룹핑하면 같은 USER_ID에 대해 항상 하나의 NICKNAME만 존재하게 된다. 따라서 굳이 NICKNAME을 추가로 그룹핑하지 않아도 된다. 닉네임은 USER_ID 기준으로 유일하게 나오기 때문이다.

반면 닉네임이 USER_ID와 1:1 대응이 확실하지 않거나, 닉네임이 바뀔 가능성이 있을 때는 NICKNAME도 별도로 GROUP BY절에 명시해주는 것이 좋다. 예를 들면 NICKNAMEUSER_ID별로 여러개인 경우, NICKNAME까지 넣어야 그룹이 정확하게 나뉜다. 특히 복잡한 조인이나 다중 값 가능성이 있다면 닉네임까지 포함하는 게 안전하다.