[SQL] Programmers 문제 풀기 (대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기)
해당 문제는 Programmers에서 사용한 문제이며 모든 테이블의 자료와 출처는 Programmers임을 밝힙니다.
해당 글에서는 서브쿼리와 GROUP BY를 이용하여 푸는 문제로 초보자가 하기에는 보통~어려움 정도의 난이도를 가지고 있습니다.
해당 문제 원본을 확인 하시려면 해당 사이트를 들어가시면 될 것 같습니다.
시작하겠습니다.
CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 대여 시작일을 기준으로 2022년 8월부터 2022년 10월까지 총 대여 횟수가 5회 이상인 자동차들에 대해서 해당 기간 동안의 월별 자동차 ID 별 총 대여 횟수(컬럼명: RECORDS) 리스트를 출력하는 SQL문을 작성해주세요. 결과는 월을 기준으로 오름차순 정렬하고, 월이 같다면 자동차 ID를 기준으로 내림차순 정렬해주세요. 특정 월의 총 대여 횟수가 0인 경우에는 결과에서 제외해주세요.
여기서 알아야 할 것은 2022-08 ~ 2022-10 까지의 총 대여 횟수가 5회 이상이여야 하는 것이 전제조건입니다.. 그리고 대여한 총 횟수를 넣는 것이 아닌 각각의 월에 해당 자동차를 대여한 횟수를 출력해야 하는 것입니다.(저는 계속 총 횟수를 넣는 바람에 시간을 많이 지체 하였습니다.)
즉, 간단하게 5회 이상 대여한 CAR_ID를 가져오고 조건문에 해당 CAR_ID를 넣어준 후 각각의 월에 빌린 카운트 수를 세어 주면 될 것 같습니다.
1. 조건에 맞는 CAR_ID 추출하기
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(CAR_ID) >= 5
DATE_FORMAT을 쓰는 방법도 있으나 저는 이번에는 굳이 사용할 필요가 없다 생각 되어 직관적인 BETWEEN AND를 사용했습니다.
CAR_ID를 그룹으로 묶고 HAVING절을 사용하여 해당 CAR_ID의 카운트가 5개 이상인 값들만 추출하도록 만들어 주었습니다.
위의 코드 결과와 같이 5번 이상 대여한 자동차 목록들이 출력되었습니다. 이제 저희는 해당 CAR_ID만 이용하면 되는 것입니다.
2. WHERE 절에 추가하고 값 확인 하기
SELECT MONTH(START_DATE) AS MONTH
, CAR_ID
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(CAR_ID) >= 5)
AND START_DATE BETWEEN '2022-08-01' AND '2022-10-31'
우선 맨 아래에 날짜 조건을 추가해준 이유는 WHERE절에서의 서브 쿼리에서 날짜 조건을 추가하여 CAR_ID를 가져오긴 하였으나, 해당 CAR_ID를 날짜조건을 추가해주지 않으면 11월 달에 대여한 CAR_ID가 있게 되면 그 값도 들어가게 되기 때문에 해당 조건을 추가해준 것입니다.
이렇게 해주면 각각의 MONTH에 해당하는 총 5회 이상 대여한 CAR_ID 값을 찾을 수 있습니다.
3. GROUP BY 후 카운트 수 세기
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(CAR_ID) >= 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월에 CAR_ID가 15인 값들이 3개가 있다고 가정해보겠습니다. 그럼 저희는 RECORDS의 값이 3이 출력 되도록 해야 합니다.
이를 위해 GROUP BY를 할 때 CAR_ID 또는 MONTH 하나만 그룹핑 하는 것이 아닌 CAR_ID와 MONTH를 같이 그룹핑 해준 후 COUNT를 해주면 됩니다.
그리고 문제 조건에 맞게 정렬을 해주시면 해당 코드는 정답이 됩니다!
이상으로 Programmers 문제 풀이를 마치도록 하겠습니다.