Dev Hyeri

◖코딩 테스트◗▬▬▬▬▬▬▬▬▬/프로그래머스

[SQL KIT] (2024) 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기(설명/코드/정답)

_hyeri 2024. 1. 24. 22:04

 

 

문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/151139

 

정상 코드.

SELECT MONTH(START_DATE) AS MONTH, CAR_ID, COUNT(*) AS RECORDS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE BETWEEN '2022-08-01' AND '2022-10-31'
      AND 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)
GROUP BY MONTH(START_DATE), CAR_ID 
ORDER BY MONTH, CAR_ID DESC

 

내부 동작 순서 

 

1. FROM 절

CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 데이터를 가져옵니다.

 

2. WHERE 절

START_DATE가 '2022-08-01'과 '2022-10-31' 사이이고, CAR_ID가 하위 쿼리의 결과에 포함되는 행을 필터링합니다.

 

- 하위 쿼리(서브쿼리)는 '2022-08-01'과 '2022-10-31' 사이의 START_DATE를 가진 CAR_ID 중에서 대여 횟수가 5회 이상(아래 표의  빨간색 상자)인 CAR_ID(아래 표의 노란색 상자)를 반환합니다.

 

표에서만 확인하면 하위 쿼리의 결과 2와 28이라는 노란색 상자의 아이디만 반환되므로

상위 쿼리에서 '해당 기간 동안의' 라는 문제의 조건을 충족하기 위해서 다시 기간 조건을 걸어주어야 한다. 

 

3. GROUP BY 절 

MONTH(START_DATE)로 그룹화하고 CAR_ID로 더 세분화하여 그룹화합니다.
각 그룹에 대해 대여 횟수(COUNT(*))를 계산합니다.

 

4. SELECT 절

MONTH(START_DATE)를 MONTH로 별칭 지정하여 결과에 포함합니다. CAR_ID를 그대로 가져오고 RECORDS로 COUNT(*)의 결과를 별칭 지정하여 결과에 포함합니다.

 

5. ORDER BY 절

MONTH(START_DATE)를 기준으로 오름차순 정렬합니다.
그다음으로, CAR_ID를 기준으로 내림차순 정렬합니다.

 


 

초기 코드

 

SELECT MONTH(START_DATE) AS MONTH, CAR_ID, COUNT(*) AS RECORDS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE BETWEEN '2022-08-01' AND '2022-10-31'
      AND 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)
GROUP BY MONTH(START_DATE), CAR_ID 
ORDER BY MONTH, CAR_ID DESC

 

START_DATE에 조건 기간을 벗어난 ROW는 애초에 없어 데이터에 대한 설명인 줄 알았으나

실행 결과 필수 조건이어서 추가함 

=> 정상 출력

 

MONTH CAR_ID RECORDS
8 28 3
8 27 5
8 25 5
8 23 3
8 19 1
8 15 2
8 13 5
8 11 1
8 10 3
8 8 6
8 7 4
8 5 4
8 2 5
9 28 2
9 27 1
9 25 6
9 23 4
9 21 1
9 20 4
9 19 3
9 18 4
9 15 2
9 13 4
9 12 4
9 11 6
9 10 5
9 8 5
9 7 1
9 5 1
9 2 1
10 23 1
10 21 5
10 20 2
10 19 1
10 18 3
10 15 2
10 13 5
10 12 2
10 10 3
10 8 5
10 7 1
10 2 1