250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- 그로스해킹
- 윈도우함수
- 프로그래머스
- 파이썬문풀
- 위키독스
- 서브쿼리
- 문풀
- sql문풀
- mysql
- 데이터리안넥스트레벨챌린지
- with절
- levle1
- 셀프조인
- 데이터리안
- 약수구하기
- sql50
- leetcode
- 데이터리안실전반
- 파이썬
- SQL
- SQL테스트
- 활성사용자수
- 코테준비
- 데벨챌
- join
- 티스토리챌린지
- leetcode문풀
- 오블완
- 프로그래머스문풀
- SQL고득점KIT
Archives
- Today
- Total
꿈은 데이터분석가, 취미는 계획
[MY SQL] 기간별 할인율 가격에 반영하기 본문
728x90
출처: [프로그래머스 스쿨 - 코딩테스트 연습 - MY SQL 문제] : 자동차 대여 기록 별 대여 금액 구하기
링크: https://school.programmers.co.kr/learn/courses/30/lessons/151141
문제(일부): 요금테이블, 대여이력 테이블, 기간별 할인율 테이블을 사용하여 차종이 트럭인 대여기록별 대여금액 구하기
1. 서브쿼리 활용
1) 요금테이블과 대여이력 테이블을 JOIN
2) WHERE절에서 차종이 트럭인 것으로 필터링
3) 대여기간*요금*기간별할인율
3-1) 기간별 할인율은 서브쿼리를 사용
3-1-1) WHERE절에 CASE문을 활용하여 기간별 할인율 타입 사용, COALESCE로 할인율이 없는 경우 1을 사용
SELECT
H.HISTORY_ID,
FLOOR(
(DATEDIFF(H.END_DATE, H.START_DATE) + 1) *
C.DAILY_FEE *
COALESCE((SELECT (1 - P.DISCOUNT_RATE * 0.01)
FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN P
WHERE P.CAR_TYPE = C.CAR_TYPE
AND P.DURATION_TYPE =
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 NULL
END),1)) AS FEE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY H
JOIN CAR_RENTAL_COMPANY_CAR C USING(CAR_ID)
WHERE C.CAR_TYPE = '트럭'
ORDER BY FEE DESC, H.HISTORY_ID DESC
2. WITH절 활용
1) WITH절로 대여기간 임시 테이블 생성
1-1) 대여이력과 요금테이블 JOIN하여 대여기간 조회
2) 1번과 동일한 방법으로 할인률 임시테이블 생성
3) 메인쿼리에서 할인률 임시테이블을 사용, 대여기간*요금*기간별할인율 구하기
WITH RentalPeriod AS (
SELECT
H.HISTORY_ID,
C.CAR_TYPE,
DATEDIFF(H.END_DATE, H.START_DATE) + 1 AS RENTAL_DAYS,
C.DAILY_FEE
FROM
CAR_RENTAL_COMPANY_RENTAL_HISTORY H
JOIN
CAR_RENTAL_COMPANY_CAR C USING(CAR_ID)
WHERE
C.CAR_TYPE = '트럭'),
DiscountedFees AS (
SELECT
R.HISTORY_ID,
R.DAILY_FEE,
R.RENTAL_DAYS,
COALESCE(
(SELECT (1 - P.DISCOUNT_RATE * 0.01)
FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN P
WHERE P.CAR_TYPE = R.CAR_TYPE
AND P.DURATION_TYPE =
CASE
WHEN R.RENTAL_DAYS >= 90 THEN '90일 이상'
WHEN R.RENTAL_DAYS >= 30 THEN '30일 이상'
WHEN R.RENTAL_DAYS >= 7 THEN '7일 이상'
ELSE NULL
END), 1) AS ADJUSTED_FEE_FACTOR
FROM RentalPeriod R)
SELECT
D.HISTORY_ID,
FLOOR(D.RENTAL_DAYS * D.DAILY_FEE * D.ADJUSTED_FEE_FACTOR) AS FEE
FROM
DiscountedFees D
ORDER BY
FEE DESC, D.HISTORY_ID DESC;
728x90
'SQL > SQL문풀' 카테고리의 다른 글
[MY SQL] 세대별로 자식 수가 없는 개체 찾기 (0) | 2024.05.08 |
---|---|
[MY SQL] 재귀쿼리를 활용하여 특정 세대 찾기 (0) | 2024.05.08 |
[MY SQL] 전화번호 '-'기호 넣기 (0) | 2024.04.29 |
[MY SQL] 특정 카테고리의 스킬을 보유한 개발자 조회 (0) | 2024.04.28 |
[MY SQL] 특정년도에 가입한 회원 중 구매한 회원 수, 비율 구하기 (0) | 2024.04.28 |