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 쿼리의 실행 순서는 다음과 같습니다:

  1. FROM: 테이블이나 뷰 등 데이터 소스를 지정합니다.
  2. WHERE: 데이터 소스에서 행을 필터링합니다.
  3. GROUP BY: 행을 그룹으로 집계합니다.
  4. HAVING: 그룹화된 데이터에 대해 조건을 필터링합니다.
  5. SELECT: 필요한 열을 선택합니다.
  6. ORDER BY: 결과를 정렬합니다.

 

 

SELECT 문에서 정의한 별칭(alias)은 WHERE 절에서는 사용할 수 없습니다. 이유는 SQL 쿼리의 실행 순서 때문입니다. SQL 쿼리는 SELECT 문이 실행되기 전에 WHERE 절을 평가합니다. 따라서, SELECT 절에서 정의한 별칭은 WHERE 절에서 참조할 수 없습니다


 

 

2. WITH A AS(~), B AS(~) 이런식으로 계속 작성 가능

-> 그러나 많이 설정하면 헷갈린다.

 

3. 문제 조건 잘 읽어볼 것. 문제 구조상, 하나의 조건을 해결하려고 하면 다른 조건이 자연스럽게 해결되는 경우가 있다. 

 

4.

+ Recent posts