새소식

Programmers Coding Test/MySQL

[프로그래머스 164668] MySQL - Level3 조건에 맞는 사용자와 총 거래금액 조회하기

  • -

 

조건에 맞는 사용자와 총 거래금액 조회하기

 

https://school.programmers.co.kr/learn/courses/30/lessons/164668

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

1)  문제

다음은 중고 거래 게시판 정보를 담은 USED_GOODS_BOARD 테이블과 중고 거래 게시판 첨부파일 정보를 담은 USED_GOODS_FILE 테이블입니다. 

USED_GOODS_BOARD 테이블은 다음과 같으며 BOARD_ID, WRITER_ID, TITLE, CONTENTS, PRICE, CREATED_DATE, STATUS, VIEWS는 게시글 ID, 작성자 ID, 게시글 제목, 게시글 내용, 가격, 작성일, 거래상태, 조회수를 의미합니다.

 

BOARD_ID WRITER_ID TITLE CONTENTS PRICE CREATED_DATE STATUS VIEWS
VARCHAR(5) VARCHAR(50) VARCHAR(100) VARCHAR(1000) NUMBER DATE VARCHAR(10) NUMBER
FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

 

 

USED_GOODS_USER 테이블은 다음과 같으며 USER_ID, NICKNAME, CITY, STREET_ADDRESS1, STREET_ADDRESS2, TLNO는 각각 회원 ID, 닉네임, 시, 도로명 주소, 상세 주소, 전화번호를 를 의미합니다.

 

 

USER_ID NICKNAME CITY STREET_ADDRESS1 STREET_ADDRESS2 TLNO
VARCHAR(50) VARCHAR(100) VARCHAR(100) VARCHAR(100) VARCHAR(100) VARCHAR(20)
FALSE FALSE FALSE FALSE TRUE FALSE

 

 

문제
USED_GOODS_BOARD와 USED_GOODS_USER 테이블에서 완료된 중고 거래의 총금액이 70만 원 이상인 사람의 회원 ID, 닉네임, 총거래금액을 조회하는 SQL문을 작성해주세요. 

결과는 총거래금액을 기준으로 오름차순 정렬해주세요.

 

 

 

 

 

2)  예시

 

예를 들어, USED_GOODS_BOARD테이블이 아래와 같고

 

BOARD_ID WRITER_ID TITLE CONTENTS PRICE CREATED_DATE STATUS VIEWS
B0001 zkzkdh1 캠핑의자 가벼워요 깨끗한 상태입니다. 2개 25,000 2022-11-29 SALE 34
B0002 miyeon89 벽걸이 에어컨 엘지 휘센 7평 100,000 2022-11-29 SALE 55
B0003 dhfkzmf09 에어팟 맥스 에어팟 맥스 스카이 블루 색상 판매합니다. 450,000 2022-11-26 DONE 67
B0004 sangjune1 파파야나인 포르쉐 푸쉬카 예민하신분은 피해주세요 30,000 2022-11-30 DONE 78
B0005 zkzkdh1 애플워치7 애플워치7 실버 스텐 45미리 판매합니다. 700,000 2022-11-30 DONE 99

 

 

 

USED_GOODS_USER테이블이 다음과 같다면

 

 

 

USER_ID NICKNAME CITY STREET_ADDRESS1 STREET_ADDRESS2 TLNO
cjfwls91 점심만금식 성남시 분당구 내정로 185 501호 01036344964
zkzkdh1 후후후 성남시 분당구 내정로 35 가동 1202호 01032777543
spdlqj12 크크큭 성남시 분당구 수내로 206 2019동 801호 01087234922
xlqpfh2 잉여킹 성남시 분당구 수내로 1 001-004 01064534911
dhfkzmf09 찐찐 성남시 분당구 수내로 13 A동 1107호 01053422914

 

 

SQL을 실행하면 다음과 같이 출력되어야 합니다.

 

 

 

USER_ID NICKNAME TOTAL_SALES
zkzkdh1 후후후 700,000

 

 

 

 

 

 

 

3)  풀이


SQL 논리적 실행 순서
① FROM: 테이블 결합 및 필요한 데이터 검색.
② WHERE: 행을 필터링.
③ GROUP BY: 그룹화된 데이터 생성.
④ HAVING: 그룹화된 데이터에 대한 조건 검사.
⑤ SELECT: 열 선택 및 계산.
⑥ ORDER BY: 결과 정렬.

 

 

위 실행 순서에 따라 코드 작성을 해보겠습니다.

먼저, USED_GOODS_BOARD는 B로 지정하고, USED_GOODS_USER은 U로 지정하겠습니다.

 

 


1. U 테이블에서 정보를 조회할 것이고, U테이블의 회원아이디, B테이블의 작성자아이디를 통해

양쪽 테이블을 연결 INNER JOIN 해줍니다.

● FROM USED_GOODS_USER AS U
INNER JOIN USED_GOODS_BOARD AS B ON U.USER_ID = B.WRITER_ID
회원이 게시글을 작성해주니 회원아이디 = 작성자아이디라고 생각할 수 있고, 예시에도 같음을 확인할 수 있으나,

문제에서 이에 대한 설명이 부족하여 아쉽다고 생각합니다.


 

 

 

2. 판매상태가 완료된 상품만을 조회합니다.

● WHERE B.STATUS = 'DONE'

WHERE 조건에 총 판매량 TOTAL_SALES가 70만원 이상(AND TOTAL_SALES >= 700000)인 것을 조건으로 하지 못하는 이유는 WHERE에서는 집계함수나 별칭으로 만든 항목을 사용할 수 없기때문이다. 

 

 

 

 


3. 회원아이디로 그룹화해주고(결과값이 회원아이디별로 출력), 조건으로 총거래금액이 70만원 이상으로 정해줍니다.
GROUP BY U.USER_ID
HAVING TOTAL_SALES >= 700000

 

 

 

 

 

4. 회원아이디, 닉네임을 조회하고, 그룹화된 회원별로 판매액을 모두 더해(SUM) TOTAL_SALES란 칼럼으로 나타냅니다.
SELECT U.USER_ID, U.NICKNAME, 
SUM(B.PRICE) AS `TOTAL_SALES`

비록 HAVING 이후 순서인 SELECT 단계에서 별칭인 TOTAL_SALES를 정의하였으나, GROUP BY 및 HAVING에서는 사용이 가능합니다.
또한, 별칭 지정시 특수문자나 공백이 있을 경우 `` 백틱으로 감싸줍니다.

 

 

 

 

 

5. 총거래금액의 오름차순으로 정렬합니다.
ORDER BY TOTAL_SALES ASC;

 

 

 

 

 

 

※ JOIN

테이블 간의 연결 작업을 수행하는데 사용되는 키워드

 

JOIN 유형 설명 JOIN 조건
INNER JOIN 두 테이블 사이에서 일치하는 행만 반환합니다. 조건을 ON 절에 지정
LEFT JOIN
(LEFT OUTER JOIN)
왼쪽 테이블의 모든 행과 일치하는 오른쪽 테이블의 행을 반환합니다. 조건을 ON 절에 지정
RIGHT JOIN
(RIGHT OUTER JOIN)
오른쪽 테이블의 모든 행과 일치하는 왼쪽 테이블의 행을 반환합니다. 조건을 ON 절에 지정
FULL OUTER JOIN 양쪽 테이블의 모든 행을 반환하며, 일치하지 않는 행은 NULL 값으로 채워집니다. 조건을 ON 절에 지정
CROSS JOIN 두 테이블의 모든 행을 조합하여 반환합니다. 조건이 필요 없음
NATURAL JOIN 두 테이블 사이에서 칼럼 이름이 동일한 칼럼들을 기반으로 일치하는 행을 반환합니다. 조건이 필요 없음
SELF JOIN 하나의 테이블을 여러 번 사용하여 자체와 조인하는 것을 의미합니다. 별명으로 조인
USING 절 두 테이블 사이에서 일치하는 칼럼들을 지정하여 사용합니다. 조건을 USING 절에 지정

 

 

 

 

 

 

4)  코드

 

SELECT U.USER_ID, U.NICKNAME, 
SUM(B.PRICE) AS `TOTAL_SALES`
FROM USED_GOODS_USER AS U
INNER JOIN USED_GOODS_BOARD AS B ON U.USER_ID = B.WRITER_ID
WHERE B.STATUS = 'DONE'
GROUP BY U.USER_ID
HAVING TOTAL_SALES >= 700000
ORDER BY TOTAL_SALES ASC;

 

 

 

 

 

 

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.