일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- 회귀분석
- 파이썬 머신러닝 완벽 가이드
- TiL
- 중회귀모형
- 내일배움캠프
- 스파르타코딩
- SQL
- 스파르타 코딩
- R
- 스파르타
- 텍스트 분석
- 오블완
- 파이썬 철저 입문
- 내일배움
- wil
- hackerrank
- 파이썬 철저입문
- Cluster
- 파이썬 머신러닝 완벽가이드
- 미세먼지
- 내일배움카드
- 파이썬
- 프로그래머스
- MySQL
- 실전 데이터 분석 프로젝트
- 어쩌다 마케팅
- harkerrank
- 웹 스크랩핑
- 프로젝트
- 티스토리챌린지
- Today
- Total
OkBublewrap
대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 본문
<문제 설명>
다음은 어느 자동차 대여 회사의 자동차 대여 기록 정보를 담은 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블입니다. CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블은 아래와 같은 구조로 되어있으며, HISTORY_ID, CAR_ID, START_DATE, END_DATE 는 각각 자동차 대여 기록 ID, 자동차 ID, 대여 시작일, 대여 종료일을 나타냅니다.
<문제>
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년 7월 27일 | @2022년 8월 2일 |
2 | 1 | @2022년 8월 3일 | @2022년 8월 4일 |
3 | 2 | @2022년 8월 5일 | @2022년 8월 5일 |
4 | 2 | @2022년 8월 9일 | @2022년 8월 12일 |
5 | 3 | @2022년 9월 16일 | @2022년 10월 15일 |
6 | 1 | @2022년 8월 24일 | @2022년 8월 30일 |
7 | 3 | @2022년 10월 16일 | @2022년 10월 19일 |
8 | 1 | @2022년 9월 3일 | @2022년 9월 7일 |
9 | 1 | @2022년 9월 18일 | @2022년 9월 19일 |
10 | 2 | @2022년 9월 8일 | @2022년 9월 10일 |
11 | 2 | @2022년 10월 16일 | @2022년 10월 19일 |
12 | 1 | @2022년 9월 29일 | @2022년 10월 6일 |
13 | 2 | @2022년 10월 30일 | @2022년 11월 1일 |
14 | 2 | @2022년 11월 5일 | @2022년 11월 5일 |
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 |
<풀이>
1)
우선 조건부터 만들기로 했다. 8월부터 10월까지 총 다섯번 이상인 테이블 만들기
SELECT CAR_ID, MONTH(START_DATE) AS MONTH, COUNT(CAR_ID) AS RECORDS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
HAVING COUNT(CAR_ID) >= 5
위식으로 진행을 하면 월별로 합계가 나온다. 그래서 월별을 제외한 CAR_ID 기준으로 쿼리를 작성을 했다.
2)
SELECT CAR_ID, COUNT(CAR_ID)
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
HAVING COUNT(CAR_ID) >= 5
위 CAR_ID랑 원본 데이터와 조인을 시켜서 출력을 하면 될 것 같다
3)
WITH CAR_A
AS
(
SELECT CAR_ID, COUNT(CAR_ID)
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
HAVING COUNT(CAR_ID) >= 5
)
SELECT MONTH(B.START_DATE) AS MONTH, A.CAR_ID, COUNT(A.CAR_ID)
FROM CAR_A A
JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY B ON A.CAR_ID = B.CAR_ID
GROUP BY MONTH, A.CAR_ID
ORDER BY MONTH ASC, A.CAR_ID DESC
CAR_ID 8, 9, 10월 총 수가 5개 이상인 테이블의 CAR_ID와 원본 테이블와 JOIN을 시키고 월별 CAR_ID별 그룹화 후 COUNT를 썼는데 오답처리가 됬다.
4)
WITH CAR_A
AS
(
SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
HAVING COUNT(*) >= 5
)
SELECT MONTH(B.START_DATE) AS MONTH, A.CAR_ID, COUNT(A.CAR_ID)
FROM CAR_A A
JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY B ON A.CAR_ID = B.CAR_ID
GROUP BY MONTH, A.CAR_ID
ORDER BY MONTH ASC, A.CAR_ID DESC
위 코드로 테이블을 만들어서 다시 시도 했지만 오류 처리가 났다.
특정 월의 총 대여 횟수가 0인 경우에는 결과에서 제외해주세요. 이부분을 고려를 안해서 그런것 같다.
5)
특정 월의 총 대여 횟수가 0인 경우는 없는 것으로 보였다. 다른 분은 쿼리를 봤는데 테이블 생성 말고도 WHERE 절에 넣어서 하는 방법이 있었다.
SELECT MONTH(START_DATE) `MONTH`, CAR_ID, COUNT(CAR_ID) 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(CAR_ID) >= 5
)
GROUP BY `MONTH`, CAR_ID
ORDER BY 1, 2 DESC;
WHERE에서 2022-08-01 ~ 2022-10-31인 데이터만 존재가 했다. 근데 제외하고 썻을 때는 오답처리로 됬다.
6)
SELECT MONTH(START_DATE) AS MONTH, CAR_ID, COUNT(*) 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 START_DATE BETWEEN '2022-08-01' AND '2022-10-31'
GROUP BY CAR_ID
HAVING COUNT(CAR_ID) >= 5)
GROUP BY MONTH, CAR_ID
ORDER BY MONTH ASC, CAR_ID DESC
7)
테이블 만들어서 풀어보기
WITH CAR
AS
(
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
)
SELECT MONTH(START_DATE) AS MONTH, CAR_ID, COUNT(CAR_ID) 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)
GROUP BY 1, CAR_ID
ORDER BY 1 ASC, 2 DESC
WHERE에 2022-08-01~2022-10-31은 조건때문에 들어가야하는 것 같다. WHERE에 IN을 넣어서 하는 방법보다는 테이블을 만들어서 보는 것이 더 직관적으로 느껴졌다.
'개발 > SQL' 카테고리의 다른 글
헤비 유저가 소유한 장소 (0) | 2023.03.13 |
---|---|
즐겨찾기가 가장 많은 식당 정보 출력하기 (0) | 2023.03.13 |
조건에 맞는 사용자 정보 조회하기 (0) | 2023.03.12 |
자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기 (0) | 2023.03.12 |
조회수가 가장 많은 중고거래 게시판의 첨부파일 조회하기 (0) | 2023.03.09 |