ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SQL] Left Join (2)
    내일배움캠프/SQL 2024. 7. 5. 21:35

     

     

    어제에 이어서 left join 난이도 지옥 문제 하나를 풀어보도록 하겠습니다!

     

    https://school.programmers.co.kr/learn/courses/30/lessons/157339

     

    프로그래머스

    코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

    programmers.co.kr

     

     

    문제

     

    테이블 설명

     

     

    이 문제가 다른 문제들과 다른 점은 일단 테이블이 3개나 있다는 것입니다...

    각 테이블마다 자료도 많아서 파악하는데 오랜 시간이 걸렸습니다.

    그래도 이런 문제가 데이터 분석 실무에 더 가깝지 않을까요?

     

     

    각설하고, 문제를 요약해보면 다음과 같은 조건을 요구하는 것을 알 수 있습니다.

     

    1) 자동차 종류가 '세단' 또는 'SUV'

    2) 2022년 11월 1일부터 2022년 11월 30일까지 대여가능

    3) 30일 동안의 대여 금액이 50만원 이상 200만원 미만

     

    이런 조건을 가진 자료의

    자동차 ID, 자동차 종류, 대여 금액을 추출해야합니다.

    (대여 금액의 경우 정수 부분만 추출)

     

    먼저 CAR_RENTAL_COMPANY_CAR 테이블을 살펴보겠습니다.

     

    CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블

     

     

    자동차의 대여 기록이기 때문에 중복된 자료를 찾을 수가 있었습니다.

    그렇기 때문에 이 테이블에서 11월 1일부터 11월 30일까지 대여 기록이 없는 car_id를 뽑아내어

    다른 테이블에서 그에 대응하는 자동차 타입과 대여 금액을 추출하면 됩니다.

     

    FROM (CAR_RENTAL_COMPANY_CAR as a
    JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN as b
    ON a.car_type = b.car_type 
    AND a.car_type IN ('세단', 'SUV')
    AND b.duration_type = '30일 이상')
    LEFT JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY as c
    ON a.car_id = c.car_id
    AND c.end_date > '2022-11-01'

     

     

    CAR_RENTAL_COMPANY_CAR은 자동차 렌탈 회사가 갖고 있는 자동차에 대한 정보가 있는 테이블이고

    CAR_RENTAL_COMPANY_DISCOUNT_PLAN은 대여 기간에 따른 자동차 대여 할인 정보가 담긴 테이블이기 때문에

    중복되는 자료가 없습니다.

     

    따라서 두 테이블을 (inner) join을 해주고 

    on 조건 절에는 1) 자동차 종류가 '세단' 또는 'SUV'을 주었습니다.

     

    중복된 자료가 있는 CAR_RENTAL_COMPANY_RENTAL_HISTORY는on 조건 절에는 대여 종료일이 11월 01일 이후인 자료라는 조건을 주고 left join을 해줬습니다.

     

     

    WHERE c.car_id is null

     

     

    그리고 위와 같은 where 조건을 줘서 대여 종료일이 11월 01일 이후인 자료를 제외해줬습니다.

    그러면 11월 01일부터 대여가능한 모든 자동차들만 자료에 남게 됩니다.

     

    2) 2022년 11월 1일부터 2022년 11월 30일까지 대여가능을

    이렇게 바꿔서 조건을 줄 수 있었던 이유는

    CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블의 자료를 살펴봤을 때

    대여 종료일이 11월 01일 이후인 자료를 제외라는 조건을 줬을 때와 차이가 없었기 때문입니다.

     

    (즉, 다른 테이블에서는 이렇게 조건을 바꿔서 주면 100% 실행된다는 보장이 없습니다!)

     

     

    group by a.car_id

     

     

    중복이 없는 테이블에 left join을 해줬기 때문에 중복 자료는 없을테지만

    group by를 해줍니다.

     

     

    테이블의 모든 테이블을 조인해줬으니

    필요한 칼럼만 추출해주겠습니다.

     

    SELECT a.car_id, a.car_type,
    truncate(a.daily_fee*30*((100-b.discount_rate)/100),0) as fee

     

     

    마지막으로 having절에서 3) 30일 동안의 대여 금액이 50만원 이상 200만원 미만이라는 조건을 주고 정렬도 해줍니다.

     

    HAVING fee >= 500000
    AND fee < 2000000
    ORDER BY 3 DESC, 2, 1 DESC

     

     

    그러면 다음과 같은 결과가 나옵니다.

     

    정답

     

     

    이번 문제는 다른 문제와는 달리 유난히 어려웠습니다.

    하나의 자동차에도 여러 대여 기록이 있는 테이블에서

    left join은 11월 1일부터 11월 30일에 대여 기록이 없는 자동차를 추출하는데 키 역할을 하였습니다.

     

    이번 문제를 풀음으로써 프로그래머스 SQL 코드카타를 다 끝내게 되었습니다.

    그 동안 많은 문제를 풀면서 문제를 보는 시야가 넓어진 것 같아서 기쁩니다.

     

     

Designed by Tistory.