728x90
MySQL COALESCE() Function
; Return the first non-null value in a list:
SELECT COALESCE(NULL, NULL, NULL, 'W3Schools.com', NULL, 'Example.com');
Result:
W3Schools.com
프로그래머스의 SQL 고득점 Kit에 출제된 문제의 My SQL 솔루션 중 하나입니다.
(문제 참조는 https://school.programmers.co.kr/learn/courses/30/lessons/151141)
SELECT
HISTORY_ID,
FLOOR(DAILY_FEE * PERIOD *
COALESCE(
(SELECT (100 - MAX(DISCOUNT_RATE)) / 100
FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN P
WHERE PERIOD >= (DURATION_TYPE + 0) AND CAR_TYPE = '트럭')
, 1)) AS FEE
FROM
(SELECT
HISTORY_ID, DAILY_FEE, DATEDIFF(END_DATE, START_DATE) + 1 AS PERIOD
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY H
LEFT JOIN CAR_RENTAL_COMPANY_CAR C
ON H.CAR_ID = C.CAR_ID
WHERE CAR_TYPE = '트럭') AS CAR_HISTORY
ORDER BY FEE DESC, HISTORY_ID DESC
가독성을 위해 서브 쿼리를 이용해 보았습니다.
1. 대여 기록 테이블(CAR_RENTAL_COMPANY_RENTAL_HISTORY)과 자동차 테이블(CAR_RENTAL_COMPANY_CAR)을 조인하여 '트럭' 자동차에 대한 대여 기록을 가져옵니다.이 결과를 CAR_HISTORY라는 이름의 서브쿼리로 만듭니다.
2. 서브쿼리인 CAR_HISTORY를 기반으로 대여 기록 별로 대여 금액(FEE)을 계산합니다. 이 때, 할인율을 적용하여 FEE를 구합니다.
- 서브쿼리 (SELECT (100 - MAX(DISCOUNT_RATE)) / 100 FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN P WHERE PERIOD >= (DURATION_TYPE + 0) AND CAR_TYPE = '트럭') 는 할인 플랜 테이블에서 해당 기간과 자동차 종류에 맞는 최대 할인율을 찾습니다.
- 만약 해당하는 할인율이 없다면 COALESCE 함수를 사용하여 기본값 1(할인 없음)을 적용합니다.
- DAILY_FEE(일일 대여 요금)과 PERIOD(대여 기간)을 곱하고 할인율을 적용하여 FEE를 계산합니다.
- FLOOR 함수를 사용하여 소수점 이하를 버립니다.
3. FEE를 기준으로 내림차순으로 정렬하고, FEE가 같은 경우에는 HISTORY_ID를 기준으로 내림차순으로 정렬합니다.
[출처]
https://school.programmers.co.kr/learn/courses/30/lessons/151141
'성장하기 > SQL' 카테고리의 다른 글
[MySQL] OVER (0) | 2023.06.13 |
---|---|
[MySQL] WITH RECURSIVE (0) | 2023.06.09 |