본문 바로가기
SQL 문제 풀기/1. 프로그래머스 SQL : 2023.12.17~2024.2.29

<프로그래머스 53> 조건에 맞는 사용자와 총 거래금액 조회하기(Lv.3)

by HYEHYE_SON 2024. 2. 7.
728x90

 

프로그래머스에서 제공하는 SQL문제 매일 풀기 챌린지


 

문제 설명

다음은 중고 거래 게시판 정보를 담은 USED_GOODS_BOARD 테이블과 중고 거래 게시판 사용자 정보를 담은 USED_GOODS_USER 테이블입니다. USED_GOODS_BOARD 테이블은 다음과 같으며 BOARD_IDWRITER_IDTITLECONTENTSPRICECREATED_DATESTATUSVIEWS는 게시글 ID, 작성자 ID, 게시글 제목, 게시글 내용, 가격, 작성일, 거래상태, 조회수를 의미합니다.

 

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

 

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

 

Column name Type Nullable
USER_ID VARCHAR(50) FALSE
NICKANME VARCHAR(100) FALSE
CITY VARCHAR(100) FALSE
STREET_ADDRESS1 VARCHAR(100) FALSE
STREET_ADDRESS2 VARCHAR(100) TRUE
TLNO VARCHAR(20) FALSE

문제

USED_GOODS_BOARD와 USED_GOODS_USER 테이블에서 완료된 중고 거래의 총금액이 70만 원 이상인 사람의 회원 ID, 닉네임, 총거래금액을 조회하는 SQL문을 작성해주세요. 결과는 총거래금액을 기준으로 오름차순 정렬해주세요.

예시

USED_GOODS_BOARD 테이블이 다음과 같고

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

♥ 정답

select u.user_id, u.nickname, sum(b.price) as total_sales
    from used_goods_board b, used_goods_user u
    where b.writer_id = u.user_id
    and b.status = 'DONE'
    group by u.user_id, u.nickname
    having sum(b.price) >= 700000
    order by total_sales asc;
    
   
  # mysql의 경우 아래와 같이 having절에서 별칭 사용 가능
  
  	having total_sales >= 700000

 

 

해설해보기

이 문제는 EQUI JOIN과 GROUP BY를 사용하여 해결할 수 있다.

 

# 1. SELECT절

출력해줘야할 컬럼명들을 기입하는데,

해당 컬럼을 어느 테이블에서 가져올지 컬럼 앞에

테이블 명이나 테이블 별칭을 작성해주고, 온점(.)으로 연결해준다.

 

출력해줘야할 컬럼명 중 TOTAL_SALES는

used_goods_board 테이블의 price 컬럼의 값들을 sum해서 구할 수 있다.

 

# 2. FORM 절

조인할 테이블 명과, 각 테이블의 별칭을 기입해준다.

 

 

# 3. WHERE절

 

연결조건은 아래와 같이 작성해줄 수 있다.

 

■ EQUI JOIN

user_goods_board 테이블의 writer_id 컬럼과user_goods_user 테이블의 user_id 컬럼의 데이터가 일치하므로equi join을 사용하여 join조건을 줄 수 있다. 

 

일반 조건은 다음과 같다.

and b.status = 'DONE' 

조건에 완료된 중고 거래에 대한 데이터를 출력하라고 제시하였기 때문에 

user_goods_board 테이블의 status 컬럼의 값이 'DONE'인 데이터만 출력하는 

조건을 넣어준다.

 

 

# 4. GROUP BY절

user_id별 nickname 별 price의 총 합에 대한 값을 구하는 것이기 때문에

user_id와 nickname을 모두 각 group으로 묶어 주어야한다.

 

 

# 5. HAVING 절

group 함수에 대한 조건은 where절이 아니라 having절에서 줄 수 있다.

따라서 total_sales의 값이 70만원 이상인 사람에 대한 데이터를 조회해야하므로

다음과 같은 조건을 줘야한다.

 

having total_sales >= 700000

 

단, MySQL에서는 위와 같이 HAVING절에서도 별칭 사용이 가능하지만

oracle에서는 having절에 별칭을 사용할 수 없다.

따라서 oracle에서는 아래와 같이 직접 group 함수 그대로를 입력해줘야한다.

 

 having sum(b.price) >= 700000

 

 


결과 출력

 

출처 : 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges

반응형