🤔 문제
다음은 중고 거래 게시판 정보를 담은 `USED_GOODS_BOARD` 테이블과 중고 거래 게시판 사용자 정보를 담은 `USED_GOODS_USER` 테이블입니다. `USED_GOODS_BOARD` 테이블은 다음과 같으며 `BOARD_ID`, `WRITER_ID`, `TITLE`, `CONTENTS`, `PRICE`, `CREATED_DATE`, `STATUS`, `VIEWS`는 게시글 ID, 작성자 ID, 게시글 제목, 게시글 내용, 가격, 작성일, 거래상태, 조회수를 의미합니다.
`USED_GOODS_USER` 테이블은 다음과 같으며 `USER_ID`, `NICKNAME`, `CITY`, `STREET_ADDRESS1`, `STREET_ADDRESS2`, `TLNO`는 각각 회원 ID, 닉네임, 시, 도로명 주소, 상세 주소, 전화번호를 를 의미합니다.
`USED_GOODS_BOARD`와 `USED_GOODS_USER` 테이블에서 완료된 중고 거래의 총금액이 70만 원 이상인 사람의 회원 ID, 닉네임, 총거래금액을 조회하는 SQL문을 작성해주세요. 결과는 총거래금액을 기준으로 오름차순 정렬해주세요.
예시
`USED_GOODS_BOARD` 테이블이 다음과 같고
`USED_GOODS_USER` 테이블이 다음과 같을 때
SQL을 실행하면 다음과 같이 출력되어야 합니다.
💻 나의 풀이
SELECT ugu.USER_ID,
ugu.NICKNAME,
SUM(ugb.PRICE) AS TOTAL_SALES
FROM USED_GOODS_BOARD ugb
JOIN USED_GOODS_USER ugu ON ugb.WRITER_ID = ugu.USER_ID
WHERE ugb.STATUS = 'DONE'
AND SUM(ugb.PRICE) >= 700000
GROUP BY ugb.WRITER_ID -- 작성자ID를 기준으로 묶음
ORDER BY TOTAL_SALES;
결과
🖍 오답노트
틀린 이유
문제에서 주어진 조건은 2가지.
- 조건 1. 거래상태가 '완료'인 거래에 한해서
- 조건 2. 총 금액이 70만원 이상인 사람
첫번째 시도에서는 모든 조건을 `WHERE`절에 때려넣었는데, `Invalid use of group function`이라는 에러가 발생했다.
두번째 시도에서는 모든 조건을 `HAVING`절에 때려넣었는데, `HAVING`절에서 `STATUS` 컬럼을 인식하지 못했다.
계속해서 `Unknown column 'ugb.STATUS' in 'having clause'`이라는 에러가 발생했다.
조건을 잘 보면 조건 1에 한해서 조건 2가 만족되어야 한다.
즉, `WHERE` 절에서 조건 1을 만족시키게 한 후 묶어준 그룹 내에서 `HAVING`절로 조건 2를 만족시켜야 했던 것이다.
이유는 문법 순서에 있다.
📌 SQL 구문 순서
SELECT 컬럼명 --------------------- ⑤
FROM 테이블명 ------------------- ①
WHERE 테이블 조건 --------------- ②
GROUP BY 컬럼명 -------------------- ③
HAVING 그룹 조건 ----------------- ④
ORDER BY 컬럼명 -------------------- ⑥
`WHERE`이 먼저 실행되면 `WHERE` 조건을 만족한 데이터를 `GROUP BY`로 그룹화하고, 해당 그룹에 대해서 `HAVING` 그룹 조건을 수행하게 된다.
💡 정답 풀이
다시 풀어보았다.
SELECT ugu.USER_ID,
ugu.NICKNAME,
SUM(ugb.PRICE) AS TOTAL_SALES
FROM USED_GOODS_BOARD ugb
LEFT JOIN USED_GOODS_USER ugu ON ugb.WRITER_ID = ugu.USER_ID
WHERE ugb.STATUS = 'DONE'
GROUP BY ugb.WRITER_ID -- 작성자ID를 기준으로 묶음
HAVING TOTAL_SALES >= 700000
ORDER BY TOTAL_SALES;
'취업준비 > 코딩테스트 문제 풀이' 카테고리의 다른 글
[프로그래머스 SQL 코딩테스트 연습] String, Date - 자동차 대여 기록 별 대여 금액 구하기 (0) | 2024.04.08 |
---|---|
[프로그래머스 SQL 코딩테스트 연습] GROUP BY - 식품분류별 가장 비싼 식품의 정보 조회하기 (0) | 2024.04.04 |
[프로그래머스 SQL 코딩테스트 연습] GROUP BY - 부서별 평균 연봉 조회하기 (0) | 2024.03.30 |
[프로그래머스 SQL 고득점 Kit] SELECT - 오프라인/온라인 판매 데이터 통합하기 (1) | 2024.03.29 |
[프로그래머스 SQL 고득점 Kit] SELECT - 재구매가 일어난 상품과 회원 리스트 구하기 (1) | 2024.03.29 |