PS/SQL
[SQL] 조건에 맞는 사용자와 총 거래금액 조회하기
행복한라이언
2024. 2. 4. 16:09
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
반응형