https://school.programmers.co.kr/learn/courses/30/lessons/151139
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제
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 |
필자는 우선 결과 테이블대로 출력하기 위해 틀을 짜보았다.
SELECT MONTH(START_DATE) AS MONTH , CAR_ID, COUNT(CAR_ID) AS RECORDS FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE (MONTH(START_DATE) BETWEEN 8 AND 10)
GROUP BY MONTH,CAR_ID
ORDER BY MONTH,CAR_ID DESC
MONTH | CAR_ID | RECORDS |
8 | 29 | 4 |
8 | 28 | 3 |
8 | 27 | 5 |
·
·
·
위와 같이 대여 시작일이 8월~10월 사이에 있고, 월별, 카드 아이디별 총 대여횟수를 구하였다. 하지만 문제는 8월부터 10월까지 총 대여 횟수가 5회 이상인 CAR_ID를 뽑는 문제이다. 이 부분을 서브쿼리를 이용해 풀어보았다.
SELECT CAR_ID FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE MONTH(START_DATE) BETWEEN 8 AND 10
GROUP BY CAR_ID
HAVING COUNT(*) >=5
위 코드를 해석하면 대여 시작일이 8월~10월이고, 이를 CAR_ID별로 그룹화 하고 HAVING절을 이용해 총 대여횟수가 5회 이상인 CAR_ID만을 출력한다.
CAR_ID |
15 |
27 |
13 |
·
·
·
따라서 위 CAR_ID에 해당하는 아이디만 출력하면 되는 문제이다.
SELECT MONTH(START_DATE) AS MONTH , CAR_ID, COUNT(CAR_ID) AS RECORDS FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE (MONTH(START_DATE) BETWEEN 8 AND 10) AND CAR_ID IN (SELECT CAR_ID FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE MONTH(START_DATE) BETWEEN 8 AND 10
GROUP BY CAR_ID
HAVING COUNT(*) >=5)
GROUP BY MONTH,CAR_ID
ORDER BY MONTH,CAR_ID DESC
기존의 WHERE절에 CAR_ID의 조건을 서브쿼리를 이용해 그대로 덧붙였다.
'SQL' 카테고리의 다른 글
SQL) 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기 (0) | 2023.02.15 |
---|---|
SQL) 대여 기록이 존재하는 자동차 리스트 구하기 (0) | 2023.02.15 |
SQL) 자동차 장기/단기 대여 구분하기 (0) | 2023.01.26 |
서브쿼리 응용(4) (0) | 2023.01.15 |
JOIN이 포함된 서브쿼리 (0) | 2023.01.13 |