728x90
반응형
문제링크
https://school.programmers.co.kr/learn/courses/30/lessons/164668
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
반응형
'PS > SQL' 카테고리의 다른 글
[SQL] 자동차 종류 별 특정 옵션이 포함된 자동차 수 구하기 (0) | 2024.02.05 |
---|---|
[SQL] 입양 시각 구하기(1) (0) | 2024.02.05 |
[SQL] 즐겨찾기가 가장 많은 식당 정보 출력하기 (7) | 2024.02.02 |
[SQL] 이름에 el이 들어가는 동물 찾기 (0) | 2024.02.01 |
[SQL] 중복 제거하기 (0) | 2024.02.01 |