SQL: 코딩테스트 연습

yongseok·2023년 3월 24일
0

DATABASE

목록 보기
2/2

프로그래머스 SQL 연습문제

추가된 SQL 문제에 대한 풀이입니다.

SELECT

조건에 부합하는 중고거래 댓글 조회하기

  • USED_GOODS_BOARD와 USED_GOODS_REPLY 테이블에서
  • 2022년 10월에 작성된
  • 게시글 제목, 게시글 ID, 댓글 ID, 댓글 작성자 ID, 댓글 내용, 댓글 작성일을 조회하는 SQL문을 작성해주세요.
  • 결과는 댓글 작성일을 기준으로 오름차순 정렬해주시고, 댓글 작성일이 같다면 게시글 제목을 기준으로 오름차순 정렬해주세요.
SELECT ugb.TITLE
	, ugb.BOARD_ID
    , ugr.REPLY_ID
    , ugr.WRITER_ID
    , ugr.CONTENTS
    , TO_CHAR(ugr.CREATED_DATE,'YYYY-MM-DD')
FROM USED_GOODS_REPLY ugr
	LEFT JOIN USED_GOODS_BOARD ugb
	ON ugr.BOARD_ID = ugb.BOARD_ID
WHERE ugb.CREATED_DATE BETWEEN TO_DATE('20221001','YYYYMMDD') AND TO_DATE('20221031','YYYYMMDD')
ORDER BY TO_CHAR(ugr.CREATED_DATE,'YYYY-MM-DD'),ugb.TITLE;

String,Date(1)

조건에 부합하는 중고거래 상태 조회하기

  • USED_GOODS_BOARD 테이블에서
  • 2022년 10월 5일에 등록된
  • 중고거래 게시물의 게시글 ID, 작성자 ID, 게시글 제목, 가격, 거래상태를 조회하는 SQL문을 작성해주세요.
  • 거래상태가 SALE 이면 판매중, RESERVED이면 예약중, DONE이면 거래완료 분류하여 출력해주시고,
  • 결과는 게시글 ID를 기준으로 내림차순 정렬해주세요.
SELECT BOARD_ID
	, WRITER_ID
    , TITLE
    , PRICE
    ,(CASE WHEN STATUS='SALE' THEN '판매중'
    WHEN STATUS='RESERVED' THEN '예약중'
    WHEN STATUS='DONE'THEN '거래완료'
    ELSE '' END) AS STATUS
FROM USED_GOODS_BOARD
WHERE CREATED_DATE=TO_DATE('20221005','YYYYMMDD')
ORDER BY BOARD_ID DESC;

String,Date(2)

조회수가 가장 많은 중고거래 게시판의 첨부파일 조회하기

  • USED_GOODS_BOARD와 USED_GOODS_FILE 테이블에서
  • 조회수가 가장 높은 중고거래 게시물에 대한
  • 첨부파일 경로를 조회하는 SQL문을 작성해주세요.
    • 기본적인 파일경로는 /home/grep/src/ 이며, 게시글 ID를 기준으로 디렉토리가 구분되고, 파일이름은 파일 ID, 파일 이름, 파일 확장자로 구성되도록 출력해주세요. 조회수가 가장 높은 게시물은 하나만 존재합니다.
  • 첨부파일 경로는 FILE ID를 기준으로 내림차순 정렬해주세요.
SELECT ('/home/grep/src/'||BOARD_ID||'/'||FILE_ID||FILE_NAME||FILE_EXT) FILE_PATH
FROM USED_GOODS_FILE ugf
WHERE BOARD_ID=(
    SELECT BOARD_ID FROM USED_GOODS_BOARD WHERE VIEWS=(
        SELECT MAX(VIEWS) FROM USED_GOODS_BOARD
    )
)
ORDER BY FILE_ID DESC;

String,Date(3)

조건에 맞는 사용자 정보 조회하기

  • USED_GOODS_BOARD와 USED_GOODS_USER 테이블에서
  • 중고 거래 게시물을 3건 이상 등록한 사용자의
  • 사용자 ID, 닉네임, 전체주소, 전화번호를 조회하는 SQL문을 작성해주세요.
    • 이때, 전체 주소는 시, 도로명 주소, 상세 주소가 함께 출력되도록 해주시고,
    • 전화번호의 경우 xxx-xxxx-xxxx 같은 형태로 하이픈 문자열(-)을 삽입하여 출력해주세요.
  • 결과는 회원 ID를 기준으로 내림차순 정렬해주세요.
SELECT USER_ID
	, NICKNAME
    , (CITY||' '||STREET_ADDRESS1||' '||STREET_ADDRESS2) 전체주소
	, (SUBSTR(TLNO,1,3)||'-'||SUBSTR(TLNO,4,4)||'-'||SUBSTR(TLNO,8,4)) 전화번호
FROM USED_GOODS_USER
WHERE USER_ID IN(
    SELECT WRITER_ID FROM USED_GOODS_BOARD GROUP BY WRITER_ID HAVING COUNT(*)>=3
)
ORDER BY USER_ID DESC;

GROUP BY

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

  • USED_GOODS_BOARD와 USED_GOODS_USER 테이블에서
  • 완료된 중고 거래의 총금액이 70만 원 이상인 사람의
  • 회원 ID, 닉네임, 총거래금액을 조회하는 SQL문을 작성해주세요.
  • 결과는 총거래금액을 기준으로 오름차순 정렬해주세요.
SELECT ugb.WRITER_ID USER_ID
	, ugu.NICKNAME
    , SUM(ugb.PRICE) TOTAL_SALES 
FROM USED_GOODS_BOARD ugb 
	LEFT JOIN
	USED_GOODS_USER ugu
	ON ugu.USER_ID=ugb.WRITER_ID
WHERE ugb.STATUS='DONE' 
GROUP BY ugb.WRITER_ID, ugu.NICKNAME 
HAVING SUM(ugb.PRICE)>=700000
ORDER BY TOTAL_SALES;

기억할 부분

  • SUBSTR()
  • CASE WHEN~THEN ELSE~END

0개의 댓글