🤔 문제
다음은 중고 거래 게시판 정보를 담은 `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 |
🤔 문제
다음은 중고 거래 게시판 정보를 담은 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 |