본문 바로가기

코딩테스트/SQL

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

SELECT 
    TO_NUMBER(TO_CHAR(START_DATE, 'MM')) AS MONTH,
    CAR_ID,
    COUNT(*) AS RECORDS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE BETWEEN TO_DATE('2022-08-01', 'YYYY-MM-DD') 
                      AND TO_DATE('2022-10-31', 'YYYY-MM-DD')
GROUP BY TO_NUMBER(TO_CHAR(START_DATE, 'MM')), CAR_ID
HAVING CAR_ID IN (
    SELECT CAR_ID
    FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
    WHERE START_DATE BETWEEN TO_DATE('2022-08-01', 'YYYY-MM-DD') 
                          AND TO_DATE('2022-10-31', 'YYYY-MM-DD')
    GROUP BY CAR_ID
    HAVING COUNT(*) >= 5
)
ORDER BY MONTH, CAR_ID DESC;
 
 
1. FROM 절
  • 쿼리에서 데이터를 가져올 테이블이나 뷰를 결정합니다.
  • 테이블 간 조인이 있다면 이 단계에서 처리됩니다.
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY

2. WHERE 절

  • FROM 절에서 가져온 데이터 중 조건을 만족하는 행을 필터링합니다.
  • 조건이 포함된 행만 다음 단계로 전달됩니다.
WHERE START_DATE BETWEEN TO_DATE('2022-08-01', 'YYYY-MM-DD') 
                      AND TO_DATE('2022-10-31', 'YYYY-MM-DD')

3. GROUP BY 절

  • 필터링된 데이터를 그룹화합니다.
  • 지정된 컬럼을 기준으로 그룹을 생성합니다.
GROUP BY TO_NUMBER(TO_CHAR(START_DATE, 'MM')), CAR_ID

4. HAVING 절

  • GROUP BY로 그룹화된 데이터에 조건을 적용합니다.
  • WHERE는 행 필터링, HAVING은 그룹 필터링에 사용됩니다.
HAVING CAR_ID IN (
    SELECT CAR_ID
    FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
    WHERE START_DATE BETWEEN TO_DATE('2022-08-01', 'YYYY-MM-DD') 
                          AND TO_DATE('2022-10-31', 'YYYY-MM-DD')
    GROUP BY CAR_ID
    HAVING COUNT(*) >= 5
)

5. SELECT 절

  • 필터링과 그룹화가 끝난 후 필요한 컬럼을 선택합니다.
  • 여기에서 계산된 값(예: COUNT, SUM)이나 별칭을 지정할 수 있습니다.
SELECT 
    TO_NUMBER(TO_CHAR(START_DATE, 'MM')) AS MONTH,
    CAR_ID,
    COUNT(*) AS RECORDS

6. ORDER BY 절

  • SELECT로 반환된 결과를 정렬합니다.
  • 지정된 컬럼에 따라 오름차순(기본값) 또는 내림차순으로 정렬합니다.
ORDER BY MONTH, CAR_ID DESC

 

실제 실행 순서 요약

  1. FROM: 데이터를 읽음.
  2. WHERE: 조건을 만족하는 행만 필터링.
  3. GROUP BY: 데이터를 그룹화.
  4. HAVING: 그룹화된 데이터에 조건 적용.
  5. SELECT: 최종 컬럼을 선택.
  6. ORDER BY: 결과를 정렬.

 

작성된 쿼리에서 실행 순서

  1. FROM
    CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 데이터를 읽음.
  2. WHERE
    START_DATE가 2022년 8월 1일부터 10월 31일 사이인 행만 필터링.
  3. GROUP BY
    월(TO_NUMBER(TO_CHAR(START_DATE, 'MM')))과 자동차 ID(CAR_ID)를 기준으로 그룹화.
  4. HAVING
    서브쿼리를 실행해 총 대여 횟수가 5회 이상인 CAR_ID만 필터링.
  5. SELECT
    MONTH, CAR_ID, COUNT(*) AS RECORDS를 선택.
  6. ORDER BY
    월(MONTH)은 오름차순, 자동차 ID(CAR_ID)는 내림차순으로 정렬.

'코딩테스트 > SQL' 카테고리의 다른 글

가격대 별 상품 개수 구하기  (0) 2024.11.26