2024. 9. 15. 18:00ㆍSQL 고득점 Kit/GROUP BY
https://school.programmers.co.kr/learn/courses/30/lessons/151139
문제 설명
다음은 어느 자동차 대여 회사의 자동차 대여 기록 정보를 담은 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블입니다.
CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블은 아래와 같은 구조로 되어있으며, HISTORY_ID, CAR_ID, START_DATE, END_DATE 는 각각 자동차 대여 기록 ID, 자동차 ID, 대여 시작일, 대여 종료일을 나타냅니다.
Column name | Type | Nullable |
HISTORY_ID | INTEGER | FALSE |
CAR_ID | INTEGER | FALSE |
START_DATE | DATE | FALSE |
END_DATE | DATE | FALSE |
문제
CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 대여 시작일을 기준으로 2022년 8월부터 2022년 10월까지 총 대여 횟수가 5회 이상인 자동차들에 대해서 해당 기간 동안의 월별 자동차 ID 별 총 대여 횟수(컬럼명: RECORDS) 리스트를 출력하는 SQL문을 작성해주세요. 결과는 월을 기준으로 오름차순 정렬하고, 월이 같다면 자동차 ID를 기준으로 내림차순 정렬해주세요. 특정 월의 총 대여 횟수가 0인 경우에는 결과에서 제외해주세요.
예시
예를 들어 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블이 다음과 같다면
HISTORY_ID | CAR_ID | START_DATE | END_DATE |
1 | 1 | 2022-07-27 | 2022-08-02 |
2 | 1 | 2022-08-03 | 2022-08-04 |
3 | 2 | 2022-08-05 | 2022-08-05 |
4 | 2 | 2022-08-09 | 2022-08-12 |
5 | 3 | 2022-09-16 | 2022-10-15 |
6 | 1 | 2022-08-24 | 2022-08-30 |
7 | 3 | 2022-10-16 | 2022-10-19 |
8 | 1 | 2022-09-03 | 2022-09-07 |
9 | 1 | 2022-09-18 | 2022-09-19 |
10 | 2 | 2022-09-08 | 2022-09-10 |
11 | 2 | 2022-10-16 | 2022-10-19 |
12 | 1 | 2022-09-29 | 2022-10-06 |
13 | 2 | 2022-10-30 | 2022-11-01 |
14 | 2 | 2022-11-05 | 2022-11-05 |
15 | 3 | 2022-11-11 | 2022-11-11 |
대여 시작일을 기준으로 총 대여 횟수가 5회 이상인 자동차는 자동차 ID가 1, 2인 자동차입니다. 월 별 자동차 ID별 총 대여 횟수를 구하고 월 오름차순, 자동차 ID 내림차순으로 정렬하면 다음과 같이 나와야 합니다.
MONTH | CAR_ID | RECORDS |
8 | 2 | 2 |
8 | 1 | 2 |
9 | 2 | 1 |
9 | 1 | 3 |
10 | 2 | 2 |
대여 시작일을 기준으로 2022년 8월부터 2022년 10월까지, 총 5회 이상 대여된 자동차들의 월별 총 대여횟수를 구하는 문제입니다.
이 문제는 서브쿼리를 사용해 5회 이상 대여된 자동차들의 자동차 ID를 구하고, 해당 ID와 월을 그룹으로 묶어 월별 총 대여횟수를 구하는 문제입니다.
제 기준으로 서브쿼리를 사용하지 않으면 조건을 나누는 게 불가능하기 때문에, 자동차 ID를 구하는 것은 서브쿼리로, 해당 자동차 ID에 따른 월별 횟수를 구하는 것은 메인쿼리로 진행했습니다.
WHERE 조건절에서 추가로 설정해야할 조건이 있는데, 바로 대여일자를 기준으로 2022년 8월부터 2022년 10월에 있는 자동차들만 대상으로 해야 합니다. 안 그러면 8, 9, 10월을 제외한 다른 월들의 데이터도 같이 출력되기 때문에, 테스트케이스에서는 통과하더라도 이후에는 통과하지 못합니다.
정답 코드를 작성해보겠습니다.
SELECT MONTH(START_DATE) AS MONTH, CAR_ID, COUNT(CAR_ID) AS RECORDS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE CAR_ID IN (SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE >= '2022-08-01'
AND START_DATE <= '2022-10-31'
GROUP BY CAR_ID
HAVING COUNT(CAR_ID) >= 5)
AND START_DATE >= '2022-08-01'
AND START_DATE <= '2022-10-31'
GROUP BY MONTH(START_DATE), CAR_ID
ORDER BY 1 ASC, 2 DESC;
서술한 대로 2022년 8월부터 2022년 10월까지 5회 이상 대여된 차량의 자동차 ID를 구합니다.
이후, 마찬가지로 2022년 8월부터 2022년 10월까지의 월별 대여 횟수를 GROUP BY를 사용해 묶어 구해주었습니다.
ORDER BY에는 열이름 대신 숫자를 사용할 수 있는데요, 1은 1번째 열, 2는 2번째 열처럼 N은 N번째 열을 의미합니다.
이 코드는 1번째 열(월)을 기준으로 오름차순, 2번째 열(자동차 ID)을 기준으로 내림차순하도록 작성되었습니다.
'SQL 고득점 Kit > GROUP BY' 카테고리의 다른 글
[GROUP BY] 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기 (0) | 2024.09.20 |
---|---|
[GROUP BY] 즐겨찾기가 가장 많은 식당 정보 출력하기 (0) | 2024.09.19 |
[GROUP BY] 식품분류별 가장 비싼 식품의 정보 조회하기 (0) | 2024.09.17 |
[GROUP BY] 저자 별 카테고리 별 매출액 집계하기 (2) | 2024.09.16 |
[GROUP BY] 카테고리 별 도서 판매량 집계하기 (0) | 2024.09.14 |