WITH
A AS (
SELECT
CAR_ID,
TO_NUMBER(TO_CHAR(START_DATE, 'MM')) AS MONTH,
COUNT(*) AS RECORDS
FROM
CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE
TO_CHAR(START_DATE, 'YYYY-MM') BETWEEN '2022-08' AND '2022-10'
GROUP BY
CAR_ID, TO_NUMBER(TO_CHAR(START_DATE, 'MM'))
),
B AS (
SELECT
CAR_ID,
SUM(RECORDS) AS TOTAL_RECORDS
FROM
A
GROUP BY
CAR_ID
HAVING
SUM(RECORDS) >= 5
)
SELECT
A.MONTH,
A.CAR_ID,
A.RECORDS AS RECORDS
FROM
A
JOIN
B ON A.CAR_ID = B.CAR_ID
WHERE
A.RECORDS > 0 -- This ensures months with zero rentals are excluded
ORDER BY
A.MONTH ASC, A.CAR_ID DESC
;
<포인트 정리>
1. HAVING 절에는 내가 설정한 ALIAS로 설정해줄 수 없다. 즉,
HAVING
SUM(RECORDS) >= 5
이렇게 작성해야 한다.
(SQL 작동 순서)
SQL 쿼리는 작성 순서와 실행 순서가 다릅니다. SQL 쿼리의 실행 순서는 데이터베이스 엔진이 쿼리를 어떻게 처리하는지를 나타냅니다. 일반적으로 SQL 쿼리의 실행 순서는 다음과 같습니다:
- FROM: 테이블이나 뷰 등 데이터 소스를 지정합니다.
- WHERE: 데이터 소스에서 행을 필터링합니다.
- GROUP BY: 행을 그룹으로 집계합니다.
- HAVING: 그룹화된 데이터에 대해 조건을 필터링합니다.
- SELECT: 필요한 열을 선택합니다.
- ORDER BY: 결과를 정렬합니다.
SELECT 문에서 정의한 별칭(alias)은 WHERE 절에서는 사용할 수 없습니다. 이유는 SQL 쿼리의 실행 순서 때문입니다. SQL 쿼리는 SELECT 문이 실행되기 전에 WHERE 절을 평가합니다. 따라서, SELECT 절에서 정의한 별칭은 WHERE 절에서 참조할 수 없습니다
2. WITH A AS(~), B AS(~) 이런식으로 계속 작성 가능
-> 그러나 많이 설정하면 헷갈린다.
3. 문제 조건 잘 읽어볼 것. 문제 구조상, 하나의 조건을 해결하려고 하면 다른 조건이 자연스럽게 해결되는 경우가 있다.
4.
'DataEngineering' 카테고리의 다른 글
SQL 프로그래머스 문제 - 대여 기록이 존재하는 자동차 리스트 구하기 (0) | 2024.05.16 |
---|---|
SQL 프로그래머스 문제 - 조건에 맞는 사용자 정보 조회하기 (0) | 2024.05.16 |
SQL 프로그래머스 문제 - 즐겨찾기가 가장 많은 식당 정보 출력하기 (0) | 2024.05.16 |
SQL 프로그래머스 문제 - 조건에 맞는 사용자와 총 거래금액 조회하기 (0) | 2024.05.14 |
SQL 프로그래머스 문제 - 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기(중요!) (0) | 2024.05.14 |