본문 바로가기
데이터 분석/코딩 테스트_SQL

[코딩 테스트] SQL - 프로그래머스 Lv.3

by 초코레모네이드 2023. 10. 19.

 
 

프로그래머스 코딩테스트
MySQL: JOIN

  오랜 기간 보호한 동물(1)  

아직 입양을 못 간 동물 중, 가장 오래 보호소에 있었던 동물 3마리의 이름과 보호 시작일을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 시작일 순으로 조회해야 합니다.

 

# 입양을 못 간 동물 = INS에는 이름이 있지만 OUTS에는 이름이 없는 동물
select NAME, DATETIME from ANIMAL_INS
where ANIMAL_ID not in (select ANIMAL_ID from ANIMAL_OUTS)
order by DATETIME
LIMIT 3;

 
 

프로그래머스 코딩테스트
MySQL: GROUP BY

  카테고리 별 도서 판매량 집계하기  

2022년 1월의 카테고리 별 도서 판매량을 합산하고, 카테고리(CATEGORY), 총 판매량(TOTAL_SALES) 리스트를 출력하는 SQL문을 작성해주세요. 결과는 카테고리명을 기준으로 오름차순 정렬해주세요.

 

select CATEGORY, sum(SALES) as TOTAL_SALES
from BOOK B, BOOK_SALES S
where B.BOOK_ID = S.BOOK_ID and month(SALES_DATE) = 1
group by CATEGORY
order by CATEGORY;

 
 

프로그래머스 코딩테스트
MySQL: JOIN

  있었는데요 없었습니다  

관리자의 실수로 일부 동물의 입양일이 잘못 입력되었습니다. 보호 시작일보다 입양일이 더 빠른 동물의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 시작일이 빠른 순으로 조회해야합니다.

 

select OUTS.ANIMAL_ID, OUTS.NAME
from ANIMAL_INS as INS join ANIMAL_OUTS as OUTS
where INS.ANIMAL_ID = OUTS.ANIMAL_ID and OUTS.DATETIME < INS.DATETIME
order by INS.DATETIME;

 
 

프로그래머스 코딩테스트
MySQL: String, Date

  오랜 기간 보호한 동물(2)  

입양을 간 동물 중, 보호 기간이 가장 길었던 동물 두 마리의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 기간이 긴 순으로 조회해야 합니다.

 

select AU.ANIMAL_ID, AU.NAME
from ANIMAL_INS as AI join ANIMAL_OUTS as AU
where AI.ANIMAL_ID = AU.ANIMAL_ID
order by (AU.DATETIME - AI.DATETIME) desc
LIMIT 2;

 
 

프로그래머스 코딩테스트
MySQL: String, Date

  조건별로 분류하여 주문상태 출력하기  

FOOD_ORDER 테이블에서 5월 1일을 기준으로 주문 ID, 제품 ID, 출고일자, 출고여부를 조회하는 SQL문을 작성해주세요. 출고여부는 5월 1일까지 출고완료로 이 후 날짜는 출고 대기로 미정이면 출고미정으로 출력해주시고, 결과는 주문 ID를 기준으로 오름차순 정렬해주세요.

 

select ORDER_ID, PRODUCT_ID, date_format(OUT_DATE, '%Y-%m-%d')  as OUT_DATE, 
	case
		when OUT_DATE is null then '출고미정'
		when OUT_DATE <= '2022-05-01' then '출고완료'
		when OUT_DATE > '2022-05-01' then '출고대기'
	end as 출고여부
from FOOD_ORDER
order by ORDER_ID;

 
 

프로그래머스 코딩테스트
MySQL: GROUP BY

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

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

 

select u.USER_ID, u.NICKNAME, sum(price) as TOTAL_SALES
from used_goods_user U, used_goods_board B
where U.user_id = B.writer_id and B.status = 'DONE'
group by U.user_id having sum(price) >= 700000
order by sum(price) asc;

 
 

프로그래머스 코딩테스트
MySQL: GROUP BY

  즐겨찾기가 가장 많은 식당 정보 출력하기  

REST_INFO 테이블에서 음식종류별로 즐겨찾기수가 가장 많은 식당의 음식 종류, ID, 식당 이름, 즐겨찾기수를 조회하는 SQL문을 작성해주세요. 이때 결과는 음식 종류를 기준으로 내림차순 정렬해주세요.

 

SELECT A.FOOD_TYPE, A.REST_ID, A.REST_NAME, A.FAVORITES
FROM REST_INFO A JOIN (
    SELECT FOOD_TYPE, MAX(FAVORITES) AS FAVORITES
    FROM REST_INFO
    GROUP BY FOOD_TYPE
) B
ON A.FAVORITES = B.FAVORITES AND A.FOOD_TYPE = B.FOOD_TYPE 
ORDER BY FOOD_TYPE DESC

 
 

프로그래머스 코딩테스트
MySQL: String, Date

  대여 기록이 존재하는 자동차 리스트 구하기  

CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 자동차 종류가 '세단'인 자동차들 중 10월에 대여를 시작한 기록이 있는 자동차 ID 리스트를 출력하는 SQL문을 작성해주세요. 자동차 ID 리스트는 중복이 없어야 하며, 자동차 ID를 기준으로 내림차순 정렬해주세요.

 

# 1. CAR_RENTAL_COMPANY_CAR에서 CAR_TYPE이 '세단' 인 CAR_ID
# 2. CAR_RENTAL_COMPANY_RENTAL_HISTORY에서 START_DATE의 month가 10인 CAR_ID
select distinct(H.CAR_ID)
from CAR_RENTAL_COMPANY_CAR C, CAR_RENTAL_COMPANY_RENTAL_HISTORY H
where C.CAR_ID = H.CAR_ID and C.CAR_TYPE = '세단'
	and date_format(H.START_DATE, '%m') = 10
order by H.CAR_ID desc;

 
 

프로그래머스 코딩테스트
MySQL: JOIN

  없어진 기록 찾기  

천재지변으로 인해 일부 데이터가 유실되었습니다. 입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID 순으로 조회하는 SQL문을 작성해주세요.

 

select ANIMAL_ID, NAME
from ANIMAL_OUTS
where ANIMAL_ID not in (select ANIMAL_ID from ANIMAL_INS)
order by ANIMAL_ID;

 
 

프로그래머스 코딩테스트
MySQL: JOIN

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

USED_GOODS_BOARDUSED_GOODS_USER 테이블에서 중고 거래 게시물을 3건 이상 등록한 사용자의 사용자 ID, 닉네임, 전체주소, 전화번호를 조회하는 SQL문을 작성해주세요. 이때, 전체 주소는 시, 도로명 주소, 상세 주소가 함께 출력되도록 해주시고, 전화번호의 경우 xxx-xxxx-xxxx 같은 형태로 하이픈 문자열(-)을 삽입하여 출력해주세요. 결과는 회원 ID를 기준으로 내림차순 정렬해주세요.

 

select USER_ID, NICKNAME, 
concat(U.CITY, " ", U.STREET_ADDRESS1, " ", U.STREET_ADDRESS2) as 전체주소, 
concat(left(U.TLNO,3), "-", substring(U.TLNO,4,4), "-", right(U.TLNO,4)) as 전화번호
from USED_GOODS_USER U, 
	(select count(WRITER_ID), WRITER_ID
	from USED_GOODS_BOARD
	group by WRITER_ID having count(WRITER_ID) >= 3
	) B
where U.USER_ID = B.WRITER_ID
order by USER_ID desc;

 
 

프로그래머스 코딩테스트
MySQL: GROUP BY

  자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기  

CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 2022년 10월 16일에 대여 중인 자동차인 경우 '대여중' 이라고 표시하고, 대여 중이지 않은 자동차인 경우 '대여 가능'을 표시하는 컬럼(컬럼명: AVAILABILITY)을 추가하여 자동차 IDAVAILABILITY 리스트를 출력하는 SQL문을 작성해주세요. 이때 반납 날짜가 2022년 10월 16일인 경우에도 '대여중'으로 표시해주시고 결과는 자동차 ID를 기준으로 내림차순 정렬해주세요.

 

select A.car_id AS CAR_ID, CASE WHEN max(A.b) = 1 THEN '대여중' ELSE '대여 가능' END as AVAILABILITY
from (select CAR_ID,
	CASE WHEN START_DATE <= '2022-10-16' AND '2022-10-16' <= END_DATE Then 1
	else 0
	END as b
	from car_rental_company_rental_history
	group by car_id, b) AS A
group by A.car_id
ORDER BY 1 DESC

 
 

프로그래머스 코딩테스트
MySQL: 2021 Dev-Matching: 웹 백엔드 개발자(상반기)

  헤비 유저가 소유한 장소  

이 서비스에서는 공간을 둘 이상 등록한 사람을 "헤비 유저"라고 부릅니다. 헤비 유저가 등록한 공간의 정보를 아이디 순으로 조회하는 SQL문을 작성해주세요.

 

select *
from PLACES A
where HOST_ID in (select HOST_ID
		from PLACES
		group by HOST_ID
		having count(ID) >= 2)
order by ID;

 
 

프로그래머스 코딩테스트
MySQL: String, Date

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

USED_GOODS_BOARDUSED_GOODS_FILE 테이블에서 조회수가 가장 높은 중고거래 게시물에 대한 첨부파일 경로를 조회하는 SQL문을 작성해주세요. 첨부파일 경로는 FILE ID를 기준으로 내림차순 정렬해주세요. 기본적인 파일경로는 /home/grep/src/ 이며, 게시글 ID를 기준으로 디렉토리가 구분되고, 파일이름은 파일 ID, 파일 이름, 파일 확장자로 구성되도록 출력해주세요. 조회수가 가장 높은 게시물은 하나만 존재합니다.

 

select concat('/home/grep/src/', BOARD_ID, '/', FILE_ID, FILE_NAME, FILE_EXT) FILE_PATH
from (select * from USED_GOODS_FILE order by FILE_ID desc) as USF
where BOARD_ID = (
		select BOARD_ID from USED_GOODS_BOARD
		where VIEWS = (select max(VIEWS) from USED_GOODS_BOARD)
		)
;

 
 

프로그래머스 코딩테스트
MySQL: GROUP BY

  대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기  

CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 대여 시작일을 기준으로 2022년 8월부터 2022년 10월까지 총 대여 횟수가 5회 이상인 자동차들에 대해서 해당 기간 동안의 월별 자동차 ID 별 총 대여 횟수(컬럼명: RECORDS) 리스트를 출력하는 SQL문을 작성해주세요. 결과는 월을 기준으로 오름차순 정렬하고, 월이 같다면 자동차 ID를 기준으로 내림차순 정렬해주세요. 특정 월의 총 대여 횟수가 0인 경우에는 결과에서 제외해주세요.

 

# 2022년 8월 ~ 2022년 1월
# 대여 시작일 기준 총 대여 횟수 5회 이상
# 월별 자동차 ID 별 총 대여 횟수 출력: RECORDS
select month(START_DATE) as MONTH, CAR_ID, count(HISTORY_ID) as RECORDS
from CAR_RENTAL_COMPANY_RENTAL_HISTORY
where date_format(START_DATE, '%Y-%m') regexp '2022-08|2022-09|2022-10'
and CAR_ID in (
	select CAR_ID
	from CAR_RENTAL_COMPANY_RENTAL_HISTORY
	where date_format(START_DATE, '%Y-%m') regexp '2022-08|2022-09|2022-10'
	group by CAR_ID
	having count(*) >= 5
)
group by MONTH, CAR_ID
order by MONTH, CAR_ID DESC;

 
 
 

728x90

댓글