포스트

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

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 라이센스를 따릅니다.