대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기
https://school.programmers.co.kr/learn/courses/30/lessons/151139
- 문제 풀이
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-- 1. 대여횟수가 5 이상인 자동차 리스트 조회
-- 2. 해당기간 동안의 월별 자동차ID 별 총 대여횟수 조회
SELECT EXTRACT(MONTH FROM START_DATE) AS "MONTH", A.CAR_ID, COUNT(*) AS "RECORDS"
FROM (
SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE BETWEEN TO_DATE(202208, 'YYYY-MM') AND TO_DATE(20221031, 'YYYY-MM-DD')
GROUP BY CAR_ID
HAVING COUNT(*) >= 5
) A
JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY B
ON A.CAR_ID = B.CAR_ID
WHERE START_DATE BETWEEN TO_DATE(202208, 'YYYY-MM') AND TO_DATE(20221031, 'YYYY-MM-DD')
GROUP BY EXTRACT(MONTH FROM START_DATE), A.CAR_ID
ORDER BY MONTH, A.CAR_ID DESC;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT EXTRACT(MONTH FROM START_DATE) AS "MONTH", CAR_ID, COUNT(*) AS "RECORDS"
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE 1=1
AND TO_CHAR(START_DATE, 'YYYY-MM-DD') >= '2022-08-01'
AND TO_CHAR(START_DATE, 'YYYY-MM-DD') <= '2022-10-31'
AND CAR_ID IN (
SELECT DISTINCT(CAR_ID)
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE 1=1
AND TO_CHAR(START_DATE, 'YYYY-MM-DD') >= '2022-08-01'
AND TO_CHAR(START_DATE, 'YYYY-MM-DD') <= '2022-10-31'
GROUP BY CAR_ID
HAVING COUNT(*) >= 5
)
GROUP BY EXTRACT(MONTH FROM START_DATE), CAR_ID
ORDER BY MONTH, CAR_ID DESC;
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT EXTRACT(MONTH FROM START_DATE) AS "MONTH", CAR_ID, COUNT(*) AS "RECORDS"
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE
TO_CHAR(START_DATE, 'YYYY-MM-DD') BETWEEN '2022-08-01' AND '2022-10-31'
AND CAR_ID IN (
SELECT DISTINCT(CAR_ID)
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE TO_CHAR(START_DATE, 'YYYY-MM-DD') BETWEEN '2022-08-01' AND '2022-10-31'
GROUP BY CAR_ID
HAVING COUNT(*) >= 5
)
GROUP BY EXTRACT(MONTH FROM START_DATE), CAR_ID
ORDER BY MONTH, CAR_ID DESC;
- 메인 쿼리에도 날짜를 넣어야 하는 이유
- 문제의 요구사항에서는 “대여 시작일을 기준으로 2022년 8월부터 2022년 10월까지 총 대여 횟수가 5회 이상인 자동차들에 대해서 해당 기간 동안의 월별 자동차 ID 별 총 대여 횟수”를 조회하라고 명시되어 있다. 따라서 서브쿼리에서는 “대여 시작일”에 대한 기간을 필터링하여 허용된 자동차 ID를 가져오고, 메인 쿼리에서도 동일한 기간에 해당하는 대여 기록을 선택해야 한다.
- 즉, 서브쿼리에서 필터링된 자동차 ID를 메인 쿼리에서 이용하기 위해서는 동일한 기간에 해당하는 대여 기록을 찾아야 한다. 따라서 메인 쿼리에서도 날짜 조건을 사용하여 동일한 기간에 대여된 대여 기록을 선택해야 한다.
1=1
- 주로 SQL 쿼리에서 조건절을 구성할 때 사용되는 일종의 플레이스홀더(placeholder)이다.
- 이 표현은 조건을 동적으로 추가하거나 필요에 따라 조건을 변경할 때 유용하다.
- 보통
1=1
은 항상 참인 조건을 의미한다. 그러므로 조건을 추가하더라도 쿼리의 결과에는 영향을 주지 않는다. 이렇게1=1
을 사용하면 SQL 쿼리를 작성하거나 유지 보수하는 동안 쿼리의 구조를 더 쉽게 변경하고 조건을 추가하거나 제거할 수 있다.
1 2 3 4 5 6
SELECT * FROM TABLE WHERE 1=1 -- 추가 조건 1 -- 추가 조건 2 -- 추가 조건 3
- 실행 결과
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.