[Programmers-SQL] 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기

ouneno·2023년 3월 7일
0

Programmers-SQL

목록 보기
16/26
post-thumbnail

2023-03-07 화요일

💡 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기


💡 문제 해석

CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 대여 시작일을 기준으로 2022년 8월부터 2022년 10월까지 총 대여 횟수가 5회 이상인 자동차들에 대해서 해당 기간 동안의 월별 자동차 ID 별 총 대여 횟수(컬럼명: RECORDS) 리스트를 출력하는 SQL문을 작성해주세요. 결과는 월을 기준으로 오름차순 정렬하고, 월이 같다면 자동차 ID를 기준으로 내림차순 정렬해주세요. 특정 월의 총 대여 횟수가 0인 경우에는 결과에서 제외해주세요.


💡 요약

1.1 2022년 08월부터 2022년 10월까지
1.2 COUNT 5회 이상

2.1 car_id별 총 대여 COUNT AS RECORDS
2.2 월 기준 오름차순, car_id 기준 내림차순
2.3 대여횟수 NULL일 경우 결과에서 제외


1. CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블 전체 출력하기

SELECT
*
  FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY

💻 출력

💡 컬럼 설명

  • history_id - INTEGER - 자동차 대여 기록 ID
  • car_id - INTEGER - 자동차 ID
  • start_date - DATE - 대여시작일
  • end_date - DATE - 대여종료일

2. 2022년 8월부터 2022년 10월까지 대여 횟수 5회 이상

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(car_id) >= 5

💻 출력

💡 DATE_FORMAT

DATE_FORMAT(컬럼명, 원하는 포맷형식) BETWEEN a AND b

DATE_FORMAT(start_date, '%Y-%m') BETWEEN '2022-08' AND '2022-10'

2022년 08월부터 2022년 10월 사이의 데이터 중 start_date 컬럼을 '%Y-%m' 형식으로 출력한다.


3. 위의 조건에 대해 해당 기간 동안 월별 자동차 ID 별 총 대여횟수

SELECT CAR_ID
  FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE DATE_FORMAT(start_date, '%Y-%m') BETWEEN '2022-08' AND '2022-10'
        AND 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(car_id) >= 5  )

💻 출력


4. car_id별 총 대여 COUNT (AS RECORDS)

SELECT car_id,
       COUNT(car_id) AS RECORDS
  FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE DATE_FORMAT(start_date, '%Y-%m') BETWEEN '2022-08' AND '2022-10'
        AND 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(car_id) >= 5  )
GROUP BY car_id

💻 출력

💡 설명

  1. car_id COUNT 처리하고 명칭을 RECORDS라고 붙힘
  2. car_id별로 조회를 해야하기에 car_id로 GROUP BY 처리함

5. 월별로 분리하기

SELECT MONTH(start_date) AS MONTH,
       car_id,
       COUNT(car_id) AS RECORDS
  FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE DATE_FORMAT(start_date, '%Y-%m') BETWEEN '2022-08' AND '2022-10'
        AND 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(car_id) >= 5  )
GROUP BY car_id, MONTH

💻 출력

💡 MONTH()

MONTH(컬럼명)

MONTH(start_date)

start_date 컬럼에서 MONTH(달) 만 추출한다.

💡 설명

  1. MONTH(start_date)를 사용하여 start_date 컬럼에서 MONTH만 추출하고 AS MONTH 처리
  2. 월 별로 분류해야하기에 GROUP BY MONTH를 추가했다.

6. 월 기준으로 오름차순 같아면 car_id 기준 내림차순

SELECT MONTH(start_date) AS MONTH,
       car_id,
       COUNT(car_id) AS RECORDS
  FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE DATE_FORMAT(start_date, '%Y-%m') BETWEEN '2022-08' AND '2022-10'
        AND 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(car_id) >= 5  )
GROUP BY car_id, MONTH
ORDER BY MONTH ASC, car_id DESC

💻 출력


7. 대여횟수 NULL일 경우 결과에서 제외한다

SELECT MONTH(start_date) AS MONTH,
       car_id,
       COUNT(car_id) AS RECORDS
  FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE DATE_FORMAT(start_date, '%Y-%m') BETWEEN '2022-08' AND '2022-10'
        AND 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(car_id) >= 5  )
GROUP BY car_id, MONTH
HAVING records > 0
ORDER BY MONTH ASC, CAR_ID DESC

💻 출력


느낀점🙄

  1. JOIN 사용은 어느 정도 손에 익었으나, 서브쿼리 사용은 미숙함
  2. 대여횟수 NULL일 경우 출력에서 제외하는 것을 WHERE절에 놓고 한참 생각함
  3. 문제를 잘 읽어야 한다. 난이도가 높아질수록 문제 해독이 어려운 부분이 생기더라
  4. HAVING절을 잘 사용하자
  5. 블로그 작성 시간도 꽤 걸림🤔

chatGPT(1) - 코드개선


chatGPT(2)

요즘 코드 개선이나 코드의 정확한 리뷰를 위해 chatGPT를 사용중임.


??

..(장난하나)계속 틀림
프로그래머스 문제 자체가 이상한 듯

profile
지속적인 성장을 추구하는 새싹 개발자입니다🌱

0개의 댓글