https://school.programmers.co.kr/learn/courses/30/lessons/151139
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제
주어진 자동차 대여 기록 테이블에서 대여 시작일을 기준으로 2022년 8월부터 2022년 10월까지 총 대여 횟수가 5회 이상인 자동차들에 대해서 해당 기간 동안의 월별 자동차 ID 별 총 대여 횟수 리스트를 출력하는 SQL문을 작성하라.
결과는 월을 기준으로 오름차순하고, 월이 같다면 자동차 ID를 기준으로 내림차순 정렬하라.
특정 월의 총 대여 횟수가 0인 경우 결과에서 제외하라.
코드
SELECT MONTH(START_DATE) MONTH, CAR_ID, COUNT(*) RECORDS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE CAR_ID IN (SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE DATE_FORMAT(START_DATE, '%Y-%m') BETWEEN '2022-08' AND '2022-10'
GROUP BY CAR_ID
HAVING COUNT(*) >= 5)
AND DATE_FORMAT(START_DATE, '%Y-%m') BETWEEN '2022-08' AND '2022-10'
GROUP BY MONTH(START_DATE), CAR_ID
HAVING COUNT(*) > 0
ORDER BY 1, 2 DESC;
풀이
문제에서 주어진 조건을 하나도 ! 빼먹지 않고 쿼리에 포함하도록 주의해야 하는 문제이다.
나같은 경우엔 WHERE 조건절에서 서브쿼리를 이용해 CAR_ID 리스트는 잘 구해놓고, 대여시작일 필터링을 빠뜨리고 해주지 않아 틀렸다. 문제에서 주어진 조건을 쿼리에 전부 포함하였는지 꼭 한 번 쪼개서 생각해보아야 할 것 같다.
(WHERE) 우선 서브쿼리를 이용해 대여시작일이 2022년 8월~10월이고, 총 대여횟수가 5회 이상인 자동차들의 CAR_ID 리스트를 서브쿼리를 통해 구하고 WHERE 조건절을 걸어준다. 그 후, 대여시작일 필터링을 하나 더 걸어준다.
(GROUP BY) 월별 자동차 ID별 총 대여 횟수를 구해야 하기 때문에 두 컬럼을 이용해 그룹화를 해준다.
(HAVING) 문제에서 특정 월의 총 대여 횟수가 0인 경우 결과에서 제외하라고 했는데 사실 이 조건이 조금 헷갈렸다. 월별 자동차 ID별 총 대여 횟수를 의미하는건지, 월별 총 대여 횟수를 의미하는건지 헷갈려 메인쿼리의 HAVING 조건에 걸어주어야 하는지, 메인쿼리의 WHERE 조건을 하나 더 줘야하는지 고민했다. 하지만, 해당 조건이 문제의 마지막에 주어져 전자로 이해하고 쿼리를 구성했다.
SELECT, ORDER BY는 문제에서 주어진대로 쉽게 작성할 수 있다.
'SQL > Coding Test' 카테고리의 다른 글
[프로그래머스] 즐겨찾기가 가장 많은 식당 정보 출력하기 (0) | 2024.03.21 |
---|---|
[프로그래머스] 조건에 맞는 개발자 찾기 (0) | 2024.03.20 |
[프로그래머스] 가격대 별 상품 개수 구하기 (0) | 2024.03.19 |
[프로그래머스] 년, 월, 성별 별 상품 구매 회원 수 구하기 (0) | 2024.03.15 |
[프로그래머스] 물고기 종류 별 대어 찾기 (0) | 2024.03.15 |