안녕하세요!
오늘은 프로그래머스 Lv.3 문제 중 3가지 문제를 정리해 보았습니다.
문제 해결에 필요한 핵심 로직 위주로 정리했으니 도움이 되길 바랍니다.
각 문제의 상세 내용은 링크를 확인해 주세요
포함된 문제 목록
1. 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기
3. 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기
문제 링크
1. 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기
3. 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기
SELECT CAR_ID,
CASE
WHEN CAR_ID IN (
SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE '2022-10-16' BETWEEN START_DATE AND END_DATE) THEN '대여중'
ELSE '대여 가능'
END AS AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC;
자동차별로 여러 개의 대여 기록이 있을 수 있기 때문에, 먼저 서브쿼리를 사용해 해당 날짜에 대여 중인 CAR_ID 목록을 따로 뽑아내는 과정이 필요합니다. 메인 쿼리에서는 CASE 문과 IN 연산자를 활용해, 서브쿼리에서 추출된 '대여 중' 리스트에 포함되면 '대여중', 그렇지 않으면 '대여 가능'으로 표시되도록 로직을 짰습니다. 마지막으로 자동차 ID를 기준으로 내림차순 정렬하여 결과가 중복되지 않게 GROUP BY로 묶어 마무리했습니다.
SELECT B.CATEGORY, SUM(SALES) AS TOTAL_SALES
FROM BOOK B JOIN BOOK_SALES S ON B.BOOK_ID = S.BOOK_ID
WHERE DATE_FORMAT(SALES_DATE,'%Y-%m') = '2022-01'
GROUP BY B.CATEGORY
ORDER BY B.CATEGORY ASC;
먼저 DATE_FORMAT(SALES_DATE, '%Y-%m')을 사용해 판매일에서 2022년 1월 데이터만 정확히 필터링했습니다. 그 후 GROUP BY를 통해 카테고리별로 그룹을 묶고, SUM(SALES)로 해당 기간 내 각 카테고리의 총 판매량을 계산했습니다. 마지막으로 카테고리명을 기준으로 오름차순 정렬하여 문제에서 요구하는 리스트를 완성했습니다.
SELECT MONTH(START_DATE) AS MONTH, CAR_ID, COUNT(*) AS RECORDS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE CAR_ID IN (
SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE BETWEEN '2022-08-01' AND '2022-10-31'
GROUP BY CAR_ID
HAVING COUNT(*) >= 5)
AND START_DATE BETWEEN '2022-08-01' AND '2022-10-31'
GROUP BY MONTH, CAR_ID
ORDER BY MONTH ASC, CAR_ID DESC;
이 문제는 '특정 기간(8~10월) 동안 총 5회 이상 대여된 차'를 먼저 찾고, 그 차량들의 '월별 대여 횟수'를 구해야 하는 서브쿼리 문제입니다. 여기서 가장 헷갈리는 부분은 날짜 조건을 왜 서브쿼리와 메인 쿼리에 두 번이나 써야 하는가인데, 이유는 간단합니다.
- 서브쿼리 날짜 조건: 8~10월 사이에 총 5번 넘게 빌린 '단골 차 번호'를 추출하기 위해서입니다. 이 조건이 없으면 1년 전체를 통틀어 5번 빌린 차가 모두 포함될 수 있습니다.
- 메인 쿼리 날짜 조건: 서브쿼리에서 가져온 단골 차량의 전체 기록 중, 다시 한번 8~10월 기록만 남기기 위해서입니다. 이 조건을 빠뜨리면 해당 차량이 1월이나 12월 등 다른 기간에 대여된 기록까지 결과에 모두 포함됩니다.
결국 "8~10월 기준 단골"을 먼저 뽑고, 그 차량들의 "8~10월 기록만" 보겠다는 논리입니다.
포스팅 내용 중 궁금한 점이나 수정이 필요한 부분이 있다면 편하게 댓글 남겨주세요.
확인 후 빠르게 답변드리고 반영하도록 하겠습니다. 함께 공부하고 성장해요! 감사합니다. 😊

'코딩테스트' 카테고리의 다른 글
| [프로그래머스 Lv.2] SQL 문제 풀이 (진료과별 예약 횟수, 성분별 아이스크림 주문량, 카테고리별 상품 개수) (0) | 2026.03.26 |
|---|---|
| [SQL/ solvesql 난이도 3] 두 대회 연속으로 출전한 기록이 있는 배구 선수 (0) | 2026.03.22 |
| [SQL/ solvesql 난이도 3] 이달의 작가 후보 찾기 (0) | 2026.03.22 |
| [SQL/ solvesql 난이도 3] 폐쇄할 따릉이 정류소 찾기 2 (0) | 2026.03.22 |
| [SQL/ solvesql 난이도 3] 서울숲 요일별 대기오염도 계산하기 (0) | 2026.03.19 |