본문 바로가기
Programming/SQL

[프로그래머스 SQL 고득점 kit|String, Date] 자동차 대여 기록 별 대여 금액 구하기

by 용스토리랜드 2024. 8. 7.

💡문제 설명

 

 

# CTE (COMMON TABLE EXPRESSIONS) 임시 테이블

WITH SUB AS (
SELECT 
    C.DAILY_FEE,
    C.CAR_TYPE,
    H.HISTORY_ID, 
    DATEDIFF(H.END_DATE, H.START_DATE) + 1 AS DURATION,
    CASE WHEN DATEDIFF(H.END_DATE, H.START_DATE) + 1 >= 90 THEN '90일 이상'
         WHEN DATEDIFF(H.END_DATE, H.START_DATE) + 1 >= 30 THEN '30일 이상'
         WHEN DATEDIFF(H.END_DATE, H.START_DATE) + 1 >= 7 THEN '7일 이상'
         ELSE 'NONE' END AS DURATION_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY AS H 
JOIN CAR_RENTAL_COMPANY_CAR AS C 
ON C.CAR_ID = H.CAR_ID
WHERE C.CAR_TYPE = '트럭')

SELECT 
    SUB.HISTORY_ID, 
    ROUND(SUB.DAILY_FEE * (100 - IFNULL(P.DISCOUNT_RATE, 0)) / 100) * SUB.DURATION AS FEE
FROM SUB
LEFT JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN AS P
ON SUB.CAR_TYPE = P.CAR_TYPE 
AND SUB.DURATION_TYPE = P.DURATION_TYPE -- 두 개의 JOIN KEY 가 필요
ORDER BY FEE DESC, HISTORY_ID DESC

 


CTE (Coommon Table Expressions) - 가상 임시 테이블 

 

CTE란 무엇인가? CTE(Common Table Expression)는 복잡한 SQL 쿼리를 보다 단순하고 재사용 가능한 형태로 만들기 위해 사용되는 임시의 결과 집합을 정의하는 SQL 구문입니다. CTE는 쿼리 실행 시 한 번만 생성되며, 그 쿼리 내에서만 유효합니다. SQL의 WITH 구문을 사용하여 정의합니다.

 

CTE의 장점:

  1. 가독성과 유지보수성 향상: CTE는 쿼리를 더 명확하고 이해하기 쉽게 분할할 수 있게 해줍니다.
  2. 재사용성: 한 쿼리 내에서 여러 번 CTE를 참조할 수 있습니다.
  3. 재귀적 쿼리 실행 가능: 재귀 CTE를 사용하여 계층적이거나 재귀적인 데이터를 쉽게 쿼리할 수 있습니다.
WITH CTE_Name AS (
    SELECT column1, column2, ...
    FROM table
    WHERE condition
)
SELECT column1, column2, ...
FROM CTE_Name
WHERE condition;

재귀적 CTE (Recursive CTE)

재귀적 CTE란 무엇인가? 재귀적 CTE는 자기 자신을 참조하여 반복적으로 쿼리를 수행하는 CTE입니다. 이를 통해, 계층적 데이터를 탐색하거나, 복잡한 계산을 수행하거나, 순차적 데이터를 생성할 때 유용하게 사용됩니다.

재귀적 CTE의 구성: 재귀적 CTE는 두 부분으로 나뉩니다.

  1. 기본 케이스(Base Case): 재귀의 시작점을 정의하며, 보통 간단한 SELECT 문입니다.
  2. 재귀적 단계(Recursive Step): 자기 자신을 참조하는 SELECT 문으로, 이전 단계의 결과를 사용하여 다음 데이터를 생성합니다.
WITH RECURSIVE CTE_Name AS (
    -- 기본 케이스
    SELECT column1, column2, ...
    FROM table
    WHERE condition
    UNION ALL
    -- 재귀적 단계
    SELECT column1, column2, ...
    FROM table
    JOIN CTE_Name ON condition
    WHERE condition
)
SELECT * FROM CTE_Name;

 

주의점:

  • 재귀 CTE는 적절한 종료 조건이 필요합니다. 그렇지 않으면 무한 루프에 빠질 수 있습니다.
  • UNION ALL은 기본 케이스와 재귀적 단계를 연결할 때 사용합니다. UNION을 사용하면 중복된 결과가 제거되어 재귀가 제대로 동작하지 않을 수 있습니다.
반응형