LEFT JOIN, With p1 as (TABLE)

Jung In Lee·2024년 3월 30일
0

1) LEFT JOIN

  • 오랜만에 LEFT JOIN을 해야할일이 있었는데, 바로 7일이하에 해당하는 value가 없어서 null로 표시해야했다.
#IFNULL을 통해 discount_rate가 null인 부분을 모두 0으로 처리
SELECT HISTORY_ID, ROUND(daily_fee * (1 - IFNULL(discount_rate, 0) * 0.01) * DURATION, 0) AS FEE

FROM

p1

LEFT JOIN #LEFT JOIN을 통해 7일 이하 discount_rate을 null로 처리

(SELECT CAR_TYPE, duration_type, discount_rate

FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN) p2

ON p1.duration_type = p2.duration_type

and p1.car_type = p2.car_type

ORDER BY FEE DESC, HISTORY_ID DESC
  • 해당하는 값을 null값으로 적용할뿐만아니라, IFNULL을 사용해서 곱셈시 null -> 0으로 변경해서 계산을 해주었다.

2) With p1 as (TABLE)

  • sql 문제를 풀다보면, FROM 절 서브쿼리가 매우 긴 경우가있다.
    이런 경우 With 테이블별칭 AS (서브쿼리 테이블) 형태로 빼서 적용할 수가 있다.
WITH p1 AS ( 
    SELECT CAR_TYPE, daily_fee, history_id, 

    DATEDIFF(END_DATE, START_DATE) + 1 AS DURATION,

    # p2 외래키
    CASE
    WHEN DATEDIFF(END_DATE, START_DATE) + 1 >= 90 THEN '90일 이상'
    WHEN DATEDIFF(END_DATE, START_DATE) + 1 >= 30 THEN '30일 이상'
    WHEN DATEDIFF(END_DATE, START_DATE) + 1 >= 7 THEN '7일 이상'
    ELSE 'NONE'
    END duration_type


FROM CAR_RENTAL_COMPANY_CAR c,

CAR_RENTAL_COMPANY_RENTAL_HISTORY ch

WHERE c.CAR_ID = ch.CAR_ID

and c.CAR_TYPE = '트럭')
  • 개인적으로 이런 형태는, 계산하려는 칼럼만 따로 담아서 조인하는 경우에 편리한거같다.

  • 근래 풀어본 SQL 문제중에서 가장 어려운 문제인듯하다.

profile
Spring Backend Developer

0개의 댓글