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

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

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

 
 

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

  보호소에서 중성화한 동물  

보호소에서 중성화 수술을 거친 동물 정보를 알아보려 합니다. 보호소에 들어올 당시에는 중성화되지 않았지만, 보호소를 나갈 당시에는 중성화된 동물의 아이디와 생물 종, 이름을 조회하는 아이디 순으로 조회하는 SQL 문을 작성해주세요.

 

select A.ANIMAL_ID, A.ANIMAL_TYPE, A.NAME
from ANIMAL_INS A inner join ANIMAL_OUTS B on A.ANIMAL_ID = B.ANIMAL_ID
where A.SEX_UPON_INTAKE <> B.SEX_UPON_OUTCOME
order by A.ANIMAL_ID;

 
 

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

  식품분류별 가장 비싼 식품의 정보 조회하기  

FOOD_PRODUCT 테이블에서 식품분류별로 가격이 제일 비싼 식품의 분류, 가격, 이름을 조회하는 SQL문을 작성해주세요. 이때 식품분류가 '과자', '', '김치', '식용유'인 경우만 출력시켜 주시고 결과는 식품 가격을 기준으로 내림차순 정렬해주세요.

 

# 과자(허니버터,1950), 국(김치찌개, 2900), 김치(배추김치, 19000), 식용유(마조유, 8950)

select CATEGORY, PRICE as 'MAX_PRICE', PRODUCT_NAME 
from FOOD_PRODUCT
where (CATEGORY, PRICE) in (SELECT CATEGORY, MAX(PRICE)
			from FOOD_PRODUCT
			where CATEGORY in ('과자', '국', '김치', '식용유')
			group by CATEGORY)
order by PRICE desc;

 
 

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

  5월 식품들의 총매출 조회하기  

FOOD_PRODUCT와 FOOD_ORDER 테이블에서 생산일자가 2022년 5월인 식품들의 식품 ID, 식품 이름, 총매출을 조회하는 SQL문을 작성해주세요. 이때 결과는 총매출을 기준으로 내림차순 정렬해주시고 총매출이 같다면 식품 ID를 기준으로 오름차순 정렬해주세요.

 

# 생산일자가 2022년 5월
# 총매출 내림차순 > 식품ID 오름차순
select O.PRODUCT_ID, PRODUCT_NAME, (sum(O.AMOUNT) * P.PRICE) as TOTAL_SALES
from FOOD_ORDER O join FOOD_PRODUCT P on O.PRODUCT_ID = P.PRODUCT_ID
where month(O.PRODUCE_DATE) = 5 and year(O.PRODUCE_DATE) = 2022
group by O.PRODUCT_ID
order by TOTAL_SALES DESC, PRODUCT_ID;

 
 

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

  취소되지 않은 진료 예약 조회하기  

PATIENT, DOCTOR 그리고 APPOINTMENT 테이블에서 2022년 4월 13일 취소되지 않은 흉부외과(CS) 진료 예약 내역을 조회하는 SQL문을 작성해주세요. 진료예약번호, 환자이름, 환자번호, 진료과코드, 의사이름, 진료예약일시 항목이 출력되도록 작성해주세요. 결과는 진료예약일시를 기준으로 오름차순 정렬해주세요.

 

# 2022년 4월 13일, 취소되지 않은, CS 진료 예약 내역
# APPOINTMENT: APNT_NO, PT_NO, MCDP_CD, APNT_YMD
# DOCTOR: DR_NAME, DR_ID
# PATIENT: PT_NAME
select A.APNT_NO, P.PT_NAME, P.PT_NO, A.MCDP_CD, D.DR_NAME, A.APNT_YMD
from APPOINTMENT A
inner join PATIENT P on P.PT_NO = A.PT_NO
inner join DOCTOR D on D.DR_ID = A.MDDR_ID
where A.APNT_YMD like '%2022-04-13%'
	and A.APNT_CNCL_YN = 'N'
	and A.MCDP_CD = 'CS'
order by A.APNT_YMD;

 
 

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

  년, 월, 성별 별 상품 구매 회원 수 구하기  

USER_INFO 테이블과 ONLINE_SALE 테이블에서 년, 월, 성별 별로 상품을 구매한 회원수를 집계하는 SQL문을 작성해주세요. 결과는 년, 월, 성별을 기준으로 오름차순 정렬해주세요. 이때, 성별 정보가 없는 경우 결과에서 제외해주세요.

 

select YEAR(OS.SALES_DATE) as YEAR,
	MONTH(OS.SALES_DATE) as MONTH,UI.GENDER,
	count(distinct UI.USER_ID) as USERS
from USER_INFO UI
join ONLINE_SALE OS on UI.USER_ID = OS.USER_ID
where UI.GENDER is not null
group by YEAR, MONTH, GENDER
order by YEAR, MONTH, GENDER ASC;

 
 

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

  서울에 위치한 식당 목록 출력하기  

REST_INFOREST_REVIEW 테이블에서 서울에 위치한 식당들의 식당 ID, 식당 이름, 음식 종류, 즐겨찾기수, 주소, 리뷰 평균 점수를 조회하는 SQL문을 작성해주세요. 이때 리뷰 평균점수는 소수점 세 번째 자리에서 반올림 해주시고 결과는 평균점수를 기준으로 내림차순 정렬해주시고, 평균점수가 같다면 즐겨찾기수를 기준으로 내림차순 정렬해주세요.

 

select I.REST_ID, I.REST_NAME, I.FOOD_TYPE, I.FAVORITES, I.ADDRESS,	round(avg(R.REVIEW_SCORE), 2) as SCORE
from REST_INFO as I
join REST_REVIEW as R on I.REST_ID = R.REST_ID
where ADDRESS like '서울%'
group by R.REST_ID
order by SCORE DESC, I.FAVORITES DESC;

 
 

프로그래머스 코딩 테스트
MySQL: Summer/Winter Coding(2019)

  우유와 요거트가 담긴 장바구니  

데이터 분석 팀에서는 우유(Milk)와 요거트(Yogurt)를 동시에 구입한 장바구니가 있는지 알아보려 합니다. 우유와 요거트를 동시에 구입한 장바구니의 아이디를 조회하는 SQL 문을 작성해주세요. 이때 결과는 장바구니의 아이디 순으로 나와야 합니다.

 

select distinct CART_ID
from CART_PRODUCTS
where NAME = 'Milk'
	and CART_ID in (select CART_ID
			from CART_PRODUCTS
			where NAME = 'Yogurt');

 
 

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

  주문량이 많은 아이스크림들 조회하기  

7월 아이스크림 총 주문량과 상반기의 아이스크림 총 주문량을 더한 값이 큰 순서대로 상위 3개의 맛을 조회하는 SQL 문을 작성해주세요.

 

# 7월 총 주문량 + 상반기 총 주문량 값 큰 순서대로 상위 3개
select FLAVOR
from(
     select FLAVOR, TOTAL_ORDER from FIRST_HALF
     union
     select FLAVOR, TOTAL_ORDER from JULY
) A
group by FLAVOR
order by sum(TOTAL_ORDER) desc
limit 3;

 
 

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

  저자 별 카테고리 별 매출액 집계하기  

2022년 1월의 도서 판매 데이터를 기준으로 저자 별, 카테고리 별 매출액(TOTAL_SALES = 판매량 * 판매가) 을 구하여, 저자 ID(AUTHOR_ID), 저자명(AUTHOR_NAME), 카테고리(CATEGORY), 매출액(SALES) 리스트를 출력하는 SQL문을 작성해주세요. 결과는 저자 ID를 오름차순으로, 저자 ID가 같다면 카테고리를 내림차순 정렬해주세요.

 

select AU.AUTHOR_ID, AUTHOR_NAME, CATEGORY, sum(SALES*PRICE) TOTAL_SALES
from BOOK BO
join BOOK_SALES BS on BO.BOOK_ID = BS.BOOK_ID
join AUTHOR AU on BO.AUTHOR_ID = AU.AUTHOR_ID
where date_format(SALES_DATE, '%Y-%m') = '2022-01'
group by 1, 2, 3
order by AUTHOR_ID, CATEGORY desc;

 
 

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

  그룹별 조건에 맞는 식당 목록 출력하기  

MEMBER_PROFILE REST_REVIEW 테이블에서 리뷰를 가장 많이 작성한 회원의 리뷰들을 조회하는 SQL문을 작성해주세요. 회원 이름, 리뷰 텍스트, 리뷰 작성일이 출력되도록 작성해주시고, 결과는 리뷰 작성일을 기준으로 오름차순, 리뷰 작성일이 같다면 리뷰 텍스트를 기준으로 오름차순 정렬해주세요.

 

# 리뷰를 가장 많이 작성한 회원의 리뷰
# 리뷰 작성일 오름차순, 리뷰 텍스트 오름차순
select MEMBER_NAME, REVIEW_TEXT, date_format(REVIEW_DATE, '%Y-%m-%d') as REVIEW_DATE
from MEMBER_PROFILE as member
join REST_REVIEW as review
on member.MEMBER_ID = review.MEMBER_ID
where member.MEMBER_NAME = (select M.MEMBER_NAME
			from REST_REVIEW R, MEMBER_PROFILE M
			where R.MEMBER_ID = M.MEMBER_ID
			group by MEMBER_NAME
			order by count(*) DESC
			limit 1)
order by REVIEW_DATE, REVIEW_TEXT;

 
 

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

  오프라인/온라인 판매 데이터 통합하기  

ONLINE_SALE 테이블과 OFFLINE_SALE 테이블에서 2022년 3월의 오프라인/온라인 상품 판매 데이터의판매 날짜, 상품ID, 유저ID, 판매량을 출력하는 SQL문을 작성해주세요. OFFLINE_SALE 테이블의 판매 데이터의 USER_ID 값은 NULL 로 표시해주세요. 결과는 판매일을 기준으로 오름차순 정렬해주시고 판매일이 같다면 상품 ID를 기준으로 오름차순, 상품ID까지 같다면 유저 ID를 기준으로 오름차순 정렬해주세요.

 

# 2022년 3월
# off USER_ID는 NULL로 표시
# 판매일 기준 오름차순, 상품ID오름차순, 유저ID 오름차순
select date_format(SALES_DATE, '%Y-%m-%d') as SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT
from ONLINE_SALE
where SALES_DATE like '2022-03%'
union all
select date_format(SALES_DATE, '%Y-%m-%d') as SALES_DATE, PRODUCT_ID, NULL as USER_ID, SALES_AMOUNT
from OFFLINE_SALE
where SALES_DATE like '2022-03%'
order by SALES_DATE, PRODUCT_ID, USER_ID;

 
 

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

  입양 시각 구하기(2)  

보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.

 

select HOUR, ifnull(COUNT,0) as COUNT
from (
select @N := @N + 1 as HOUR from ANIMAL_OUTS, 
(select @N := -1 from DUAL)nn limit 24 
    ) as A
left join (
	select hour(DATETIME) as HR, count(*) as COUNT
	from ANIMAL_OUTS
	group by HR
) as B
on A.HOUR = B.HR

 
 

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

  특정 기간동안 대여 가능한 자동차들의 대여비용 구하기  

CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블과 CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블에서 자동차 종류가 '세단' 또는 'SUV' 인 자동차 중 2022년 11월 1일부터 2022년 11월 30일까지 대여 가능하고 30일간의 대여 금액이 50만원 이상 200만원 미만인 자동차에 대해서 자동차 ID, 자동차 종류, 대여 금액(컬럼명: FEE) 리스트를 출력하는 SQL문을 작성해주세요. 결과는 대여 금액을 기준으로 내림차순 정렬하고, 대여 금액이 같은 경우 자동차 종류를 기준으로 오름차순 정렬, 자동차 종류까지 같은 경우 자동차 ID를 기준으로 내림차순 정렬해주세요.

 

d

 
 

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

  자동차 대여 기록 별 대여 금액 구하기  

CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블과CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블에서 자동차 종류가 '트럭'인 자동차의 대여 기록에 대해서 대여 기록 별로 대여 금액(컬럼명: FEE)을 구하여 대여 기록 ID와 대여 금액 리스트를 출력하는 SQL문을 작성해주세요. 결과는 대여 금액을 기준으로 내림차순 정렬하고, 대여 금액이 같은 경우 대여 기록 ID를 기준으로 내림차순 정렬해주세요.

 

/*
1. CAR_RENTAL_COMPANY_CAR.car_type = '트럭'
2. (CAR_RENTAL_COMPANY_RENTAL_HISTORY.end_date - CAR_RENTAL_COMPANY_RENTAL_HISTORY.start_date + 1)
    대여 기간이 7, 30, 90일 이상인 경우만 할인. 구간별 할인율 다름.
3. CAR_RENTAL_COMPANY_RENTAL_HISTORY.history_id
4. FEE = ()
*/
select A.HISTORY_ID
	, truncate((A.DAILY_FEE * A.대여기간 * (100 - ifnull(C.DISCOUNT_RATE, 0)) / 100),0) as FEE
from(
	select A.CAR_TYPE, B.HISTORY_ID, A.DAILY_FEE
		, (abs(datediff(B.END_DATE, B.START_DATE)) + 1) as '대여기간'
		, case
			when (abs(datediff(B.END_DATE, B.START_DATE)) + 1) < 7 then '할인 없음'
			when (abs(datediff(B.END_DATE, B.START_DATE)) + 1) < 30 then '7일 이상'
			when (abs(datediff(B.END_DATE, B.START_DATE)) + 1) < 90 then '30일 이상' 
			else '90일 이상'
		end as '대여유형'
	from CAR_RENTAL_COMPANY_CAR A
	join CAR_RENTAL_COMPANY_RENTAL_HISTORY B on A.CAR_ID = B.CAR_ID
	where A.CAR_TYPE = '트럭'
	)A
left join CAR_RENTAL_COMPANY_DISCOUNT_PLAN C
	on A.CAR_TYPE = C.CAR_TYPE
	and A.대여유형 = C.DURATION_TYPE
order by FEE DESC, HISTORY_ID DESC

 
 
 

728x90

댓글