본문 바로가기
성장하기/SQL

[MySQL] COALESCE

by 솔로 슈퍼스타 2023. 6. 13.
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

https://www.w3schools.com/sql/func_mysql_coalesce.asp

'성장하기 > SQL' 카테고리의 다른 글

[MySQL] OVER  (0) 2023.06.13
[MySQL] WITH RECURSIVE  (0) 2023.06.09