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
실제 실행 순서 요약
- FROM: 데이터를 읽음.
- WHERE: 조건을 만족하는 행만 필터링.
- GROUP BY: 데이터를 그룹화.
- HAVING: 그룹화된 데이터에 조건 적용.
- SELECT: 최종 컬럼을 선택.
- ORDER BY: 결과를 정렬.
작성된 쿼리에서 실행 순서
- FROM
CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 데이터를 읽음. - WHERE
START_DATE가 2022년 8월 1일부터 10월 31일 사이인 행만 필터링. - GROUP BY
월(TO_NUMBER(TO_CHAR(START_DATE, 'MM')))과 자동차 ID(CAR_ID)를 기준으로 그룹화. - HAVING
서브쿼리를 실행해 총 대여 횟수가 5회 이상인 CAR_ID만 필터링. - SELECT
MONTH, CAR_ID, COUNT(*) AS RECORDS를 선택. - ORDER BY
월(MONTH)은 오름차순, 자동차 ID(CAR_ID)는 내림차순으로 정렬.
'코딩테스트 > SQL' 카테고리의 다른 글
가격대 별 상품 개수 구하기 (0) | 2024.11.26 |
---|