이직 후 데이터 테이블을 직접 조회하고 생성할 일이 많이 생겨서 SQL을 다시 사용해야 했다.
하지만 현업에서 사용한 지 시간이 좀 지났고 이직준비한 지도 꽤 되어 코테로 연습하기로 했다.
코딩테스트를 준비하면서 풀었던 프로그래머스에 마침 새로운 SQL문제가 나와서 우선 풀어보았다.
🤔 문제
https://school.programmers.co.kr/learn/courses/30/lessons/151141
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
MySQL, ORACLE SQL로 풀 수 있는 문제이고 난이도는 Lv.4이다.
테이블이 3가지가 나오고 테이블 명이 길어서 풀기에 유쾌한 문제는 아니었다.
그리고 아직 문제가 나온 지 얼마 되지 않아서 문제 완료한 사람이 별로 없었다.
😄 나의 풀이
WITH TRUCK_RENT_FEE AS(
SELECT HISTORY_ID, DATEDIFF(END_DATE, START_DATE)+1 AS RENT_DAYS
, CASE WHEN DATEDIFF(END_DATE, START_DATE)+1 < 7 THEN '할인 정책 없음'
WHEN DATEDIFF(END_DATE, START_DATE)+1 >=7 AND DATEDIFF(END_DATE, START_DATE)+1 < 30 THEN '7일 이상'
WHEN DATEDIFF(END_DATE, START_DATE)+1 >=30 AND DATEDIFF(END_DATE, START_DATE)+1 < 90 THEN '30일 이상'
ELSE '90일 이상' END AS DURATION_TYPE
, DAILY_FEE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY A
JOIN CAR_RENTAL_COMPANY_CAR B ON A.CAR_ID = B.CAR_ID
WHERE CAR_TYPE = '트럭'
)
SELECT HISTORY_ID, ROUND(DAILY_FEE*(100-COALESCE(DISCOUNT_RATE, 0))*0.01*RENT_DAYS) AS FEE
FROM TRUCK_RENT_FEE T
LEFT JOIN (SELECT DURATION_TYPE, DISCOUNT_RATE
FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN
WHERE CAR_TYPE = '트럭'
) TRUCK_DISCOUNT ON T.DURATION_TYPE = TRUCK_DISCOUNT.DURATION_TYPE
ORDER BY FEE DESC, HISTORY_ID DESC
어느 순간부터 쿼리의 유지보수하기에는 WITH문을 사용하는 것이 편하고 보기 좋아서 WITH문을 사용했다.
먼저 TRUCK_RENT_FEE라는 임시 테이블을 만들어 자동차 대여 이력별 대여기간과 일일금액을 정리했고 나중에 할인율을 곱해 대여금액 FEE를 구했다.
여기서 주의해야할 점은 대여기간을 구할 때에 date 타입인 END_DATE와 START_DATE를 그냥 빼주는 것이 아니라 DATEDIFF()를 사용해야한다는 것! 처음에 그냥 뺐다가 엄한 숫자가 나와서 틀렸었다...😅
종종 문제풀어보는것도 재밌는 것 같다.
'Exercises 🤓 > SQL' 카테고리의 다른 글
[프로그래머스] 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 - MySQL (0) | 2023.01.30 |
---|---|
[프로그래머스] 자동차 대여 기록에서 장기/단기 대여 구분하기 - MySQL (0) | 2023.01.26 |
[Codility] SqlWorldCup - SQL(PostgreSQL) (0) | 2022.08.28 |
[Codility] SqlEventsDelta - SQL(PostgreSQL) (0) | 2022.08.28 |
[프로그래머스] 입양 시각 구하기(2) - MySQL (0) | 2022.07.13 |
댓글