반응형
💡 문제)
USED_GOODS_BOARD와 USED_GOODS_USER 테이블에서 완료된 중고 거래의 총금액이 70만 원 이상인 사람의 회원 ID, 닉네임, 총거래금액을 조회하는 SQL문을 작성해주세요. 결과는 총거래금액을 기준으로 오름차순 정렬해주세요.
- 회원 ID, 닉네임, 총거래금액을 조회
SELECT B.USER_ID, B.NICKNAME, SUM(A.PRICE) AS TOTAL_SALES
문제에서 주어진 쿼리 결과대로 총거래금액의 출력 시 이름을 TOTAL_SALES로 바꾸어준다. - USED_GOODS_BOARD와 USED_GOODS_USER 테이블에서
테이블 두개가 연결되어야 함을 알 수 있다. 테이블을 보면 USER_ID에 대해서 중복된 것을 알 수 있다 (컬럼이름은 각 테이블에서 다르지만, 결국은 USER의 아이디를 가리키고 있음)
따라서 두 테이블을 유저 아이디에 대한 조건으로 INNER JOIN시켜야 한다.
그래야 각 상품 목록에 대해서 유저의 정보를 함께 출력하는 테이블을 얻을 수 있기 때문이다.
FROM USED_GOODS_BOARD A JOIN USED_GOODS_USER B ON A.WRITER_ID=B.USER_ID - 완료된 중고 거래의
위의 2번까지를 통해 각 상품에 대한 유저 정보까지 합친 테이블을 얻었으니, 이제 그 중에서도 완료된 거래에 대해서만 추려야 한다.
그러러면 WHERE 절을 이용해서 STATUS가 DONE인 것만을 가져올 수 있다.
WHERE A.STATUS="DONE" - 총금액이 70만 원 이상인 사람의
위의 과정까지는 각 상품에 대해서 개별적으로 조회되기 때문에, 한 사람의 전체 거래 내역을 고려하기 위해서는 사람의 단위로 GROUP을 지어야 한다.
따라서 GROUP BY 절을 통해 USER_ID 별로 그룹화 시킨다.
그러면 거래가 완료된 상품의 거래 주인의 아이디, 이름, 총거래금액이 출력되는데, 이 중에서도 조건에서 총거래금액이 70만원 이상인 사람의 것만 출력하라고 되어 있다.
그러므로 GROUP BY 절에 HAVING을 추가해서 그 그룹 중 총거래금액이 70만원이상인 것만 출력하도록 해준다.
GROUP BY B.USER_ID HAVING TOTAL_SALES>=700000 - 결과는 총거래금액을 기준으로 오름차순 정렬해주세요.
(나는 이 단계를 빼먹고 채점 결과가 자꾸 틀렸다고 떠서 시간을 낭비했다. 꼭 정렬 조건을 확인하도록 하자)
이제 조건에 만족하는 결과는 다 출력했다.
마지막 조건인 정렬을 해준다.
ORDER BY절을 통해 해줄 수 있다.
ORDER BY TOTAL_SALES;
위 다섯 단계를 거치면서 하나하나씩 접근하면 매우 쉬운 문제이다!
조인, WHERE절, GROUP BY절, ORDER BY절이 다 쓰인 문제라서, 순서를 한번 정리하고 넘어가자
SELECT > FROM > JOIN-ON > WHERE > GROUP BY - HAVING > ORDER BY
반응형
'CO-TE > 프로그래머스' 카테고리의 다른 글
[프로그래머스] JAVA LV2 "올바른 괄호" 풀이방법 / 스택 사용 (1) | 2023.10.19 |
---|---|
[프로그래머스] JAVA LV2 "가장 큰 수" 풀이 방법 / Arrays.sort / 람다식 사용 (1) | 2023.10.19 |
[프로그래머스] MYSQL LV2 가격이 제일 비싼 식품의 정보 출력하기 / MAX와 서브쿼리 (0) | 2023.10.19 |
[프로그래머스] JAVA / c++ LV2 전화번호 목록 / 해시알고리즘, SORT 풀이 (2) (0) | 2023.10.18 |
[프로그래머스] JAVA / c++ LV2 전화번호 목록 / 해시알고리즘, SORT 풀이 (1) (1) | 2023.10.18 |