본문 바로가기
PS/SQL

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

by 행복한라이언 2024. 2. 4.
728x90
반응형

문제링크

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

1. 핵심

  • 완료된 중고거래의 총금액이 70만원 이상인 사람
    • 중고거래가 완료: USED_GOODS_BOARD에 "STATUS"라는 컬럼이 존재한다! 처음에 이거 놓쳤다가 틀렸다. 반드시 테이블의 컬럼이 무엇인지 파악 해야 실수없이 푼다.
    • 총금액 70만원 이상: SUM 집계함수 써야한다.
  • USED_GOODS_BOARD, USED_GOODS_USER 두 테이블의 컬럼을 적절하게 사용해야하고 null값이 존재하지 않는다. 따라서 INNER JOIN으로 두 테이블을 JOIN한다.
  • 집계함수에 대한 필터링은 WHERE을 사용하지 않고 그룹핑된 행에 대한 필터링이므로 HAVING을 쓰는게 적절하다.
    • WHERE SUM(B.PRICE) >= 700000 (X)
    • HAVING SUM(B.PRICE) >= 700000 (O)
  • GROUP BY에 정의한 컬럼만 그대로 사용할 수 있으므로 USER_ID와 USER_NICKNAME 모두 GROUP BY 한다.
    • GROUP BY + HAVING의 위치는 WHERE절과 ORDER BY 사이이다. 

2. 코드(MySQL)

SELECT U.USER_ID, U.NICKNAME, SUM(B.PRICE) AS TOTAL_SALES
FROM USED_GOODS_BOARD B
INNER JOIN USED_GOODS_USER U ON B.WRITER_ID = U.USER_ID
WHERE STATUS = 'DONE'
GROUP BY U.USER_ID, U.NICKNAME
HAVING SUM(B.PRICE) >= 700000
ORDER BY TOTAL_SALES;
SELECT 
    B.WRITER_ID AS USER_ID, 
    U.NICKNAME, 
    SUM(B.PRICE) AS TOTAL_SALES
FROM 
    USED_GOODS_BOARD B, 
    USED_GOODS_USER U
# WHERE로 join
WHERE 
    B.WRITER_ID = U.USER_ID
    AND B.STATUS = 'DONE'
GROUP BY 
    B.WRITER_ID, 
    U.NICKNAME
HAVING 
    SUM(B.PRICE) >= 700000
ORDER BY 
    TOTAL_SALES;

3. 활용예제

ORDERS 테이블

ORDER_ID ORDER_DATE 주문자 ID
1 2024-02-04 101
2 2024-02-05 102

ORDER_PRODUCTS 테이블

ORDER_ID PRODUCT_ID QUANTITY
1 201 2
1 202 1
2 203 3

PRODUCTS 테이블

PRODUCT_ID PRODUCT_NAME PRICE
201 사과 5000
202 바나나 3000
203 포도 2000

 

SELECT 
    O.ORDER_ID, 
    O.ORDER_DATE, 
    SUM(P.PRICE * OP.QUANTITY) AS TOTAL_PRICE
FROM 
    ORDERS O
INNER JOIN 
    ORDER_PRODUCTS OP ON O.ORDER_ID = OP.ORDER_ID
INNER JOIN 
    PRODUCTS P ON OP.PRODUCT_ID = P.PRODUCT_ID
GROUP BY 
    O.ORDER_ID, 
    O.ORDER_DATE
HAVING 
    SUM(P.PRICE * OP.QUANTITY) >= 10000
ORDER BY 
    TOTAL_PRICE DESC;

 

주문 정보

ORDER_ID ORDER_DATE TOTAL_PRICE
1 2024-02-04 15000
2 2024-02-05 12000
728x90
반응형