본문 바로가기
코딩테스트/ORACLE

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

by 얼쩡 2024. 5. 26.
반응형

문제 설명
다음은 중고 거래 게시판 정보를 담은 USED_GOODS_BOARD 테이블과 중고 거래 게시판 사용자 정보를 담은 USED_GOODS_USER 테이블입니다. USED_GOODS_BOARD 테이블은 다음과 같으며 BOARD_ID, WRITER_ID, TITLE, CONTENTS, PRICE, CREATED_DATE, STATUS, VIEWS는 게시글 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 2019801 01087234922
xlqpfh2 잉여킹 성남시 분당구 수내로 1 001-004 01064534911
dhfkzmf09 찐찐 성남시 분당구 수내로 13 A1107 01053422914

 

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

USER_ID NICKNAME TOTAL_SALES
zkzkdh1 후후후 700000

 

 

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

 

동작순서

 

1. 내부 쿼리 실행: 내부 쿼리는 USED_GOODS_BOARD 테이블과 USED_GOODS_USER 테이블을 INNER JOIN하여 작성됩니다. 이 때, WRITER_ID와 USER_ID를 기준으로 두 테이블을 조인하고, STATUS가 'DONE' 인 행들만 가져옵니다. 그리고 각 WRITER_ID별로 NICKNAME과 PRICE의 합계를 구합니다. 이 내부 쿼리는 TOTAL_SALES를 구하는 용도로 사용됩니다.

2. 외부 쿼리 실행: 외부 쿼리는 내부 쿼리에서 생성된 결과 집합을 기반으로 합니다. 내부 쿼리의 결과 집합에서는 TOTAL_SALES가 700000 이상인 행들만 선택됩니다.

3. 결과 반환: 외부 쿼리의 결과로는 WRITER_ID, NICKNAME, TOTAL_SALES의 컬럼이 선택되며, TOTAL_SALES를 기준으로 정렬됩니다. 이렇게 함으로써 TOTAL_SALES가 높은 순서대로 결과가 반환됩니다.

쿼리는 WRITER_ID와 NICKNAME을 사용자가 이해하기 쉬운 형태로 제공하고, 총 판매액(TOTAL_SALES)이 700000 이상인 사용자들의 목록을 제공합니다.

 


참고 !

문제 설명과 나오는 데이터가 다름

 

반응형