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 | 29 | 30 | 31 |
Tags
- Gaimification
- eda
- 신경쓰기의 기술
- SQL
- 코딩테스트연습
- ProfileReport
- Inventory Optimization
- Product Demand
- MySQL
- tensorflow
- SKU Consolidation
- TensorFlowGPU
- oracle
- MS SQL Server
- 피그마인디언
- 당신의 인생이 왜 힘들지 않아야 한다고 생각하십니까
- ModelCheckPoint
- HackerRank
- forecast
- Labor Management System
- ABC Analysis
- 파이썬
- 프로그래머스
- kaggle
- leetcode
- 웨어하우스 보관 최적화
- 코딩테스트
- pandas profiling
- 딥러닝
- 데이터분석
Archives
- Today
- Total
오늘도 배운다
특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 / 프로그래머스, SQL, MySQL 본문
문제
source: 프로그래머
CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블과 CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블에서 자동차 종류가 '세단' 또는 'SUV' 인 자동차 중 2022년 11월 1일부터 2022년 11월 30일까지 대여 가능하고 30일간의 대여 금액이 50만원 이상 200만원 미만인 자동차에 대해서 자동차 ID, 자동차 종류, 대여 금액(컬럼명: FEE) 리스트를 출력하는 SQL문을 작성해주세요. 결과는 대여 금액을 기준으로 내림차순 정렬하고, 대여 금액이 같은 경우 자동차 종류를 기준으로 오름차순 정렬, 자동차 종류까지 같은 경우 자동차 ID를 기준으로 내림차순 정렬해주세요.
제출답안(MySQL)
SET @rent_for := DATEDIFF('2022-11-30', '2022-11-01') + 1;
SET @dur_type := (SELECT
CASE
WHEN @rent_for >= 90 THEN '90일 이상'
WHEN @rent_for >= 30 THEN '30일 이상'
WHEN @rent_for >= 7 THEN '7일 이상'
ELSE NULL END COLLATE utf8mb4_0900_ai_ci);
WITH
car_sd_suv AS
(SELECT *
FROM car_rental_company_car
WHERE car_type IN ('세단', 'SUV')),
rent_nov AS
(SELECT DISTINCT(car_id)
FROM car_rental_company_rental_history
WHERE
start_date <= '2022-11-30'
AND end_date >= '2022-11-01'),
dc_sd_suv AS
(SELECT *
FROM car_rental_company_discount_plan
WHERE duration_type = @dur_type COLLATE utf8mb4_0900_ai_ci)
SELECT
ls_car_nov.car_id,
ls_car_nov.car_type,
ROUND(daily_fee * @rent_for * (1 - discount_rate * 0.01)) AS fee
FROM
(SELECT *
FROM car_sd_suv
WHERE car_id NOT IN (SELECT car_id FROM rent_nov)) AS ls_car_nov
JOIN dc_sd_suv AS dc ON ls_car_nov.car_type = dc.car_type
WHERE
ROUND(daily_fee * @rent_for * (1 - discount_rate * 0.01)) >= 500000
AND ROUND(daily_fee * @rent_for * (1 - discount_rate * 0.01)) <= 2000000
ORDER BY fee DESC, car_type, car_id DESC
풀이(MySQL)
더보기
렌트기간과 duration_type을 위한 지역변수 선언
SET @rent_for := DATEDIFF('2022-11-30', '2022-11-01') + 1;
SET @dur_type := (SELECT
CASE
WHEN @rent_for >= 90 THEN '90일 이상'
WHEN @rent_for >= 30 THEN '30일 이상'
WHEN @rent_for >= 7 THEN '7일 이상'
ELSE NULL END COLLATE utf8mb4_0900_ai_ci);
CTE1: 세단과 SUV만 포함하는 차 목록
WITH
car_sd_suv AS
(SELECT *
FROM car_rental_company_car
WHERE car_type IN ('세단', 'SUV')),
CTE2: 11월에 대여된 적이 있는 차 목록
rent_nov AS
(SELECT DISTINCT(car_id)
FROM car_rental_company_rental_history
WHERE
start_date <= '2022-11-30'
AND end_date >= '2022-11-01'),
>> 11월에 대여되었음을 판단하는 기준
>> a. 렌트 시작 날짜가 11월 30일 이하이면서
>> b. 렌트 종료 날짜가 11월 1일 이상
CTE 3: 트럭의 discount plan
dc_sd_suv AS
(SELECT *
FROM car_rental_company_discount_plan
WHERE duration_type = @dur_type COLLATE utf8mb4_0900_ai_ci)
문제 요청대로 쿼리
SELECT
ls_car_nov.car_id,
ls_car_nov.car_type,
ROUND(daily_fee * @rent_for * (1 - discount_rate * 0.01)) AS fee
FROM
(SELECT *
FROM car_sd_suv
WHERE car_id NOT IN (SELECT car_id FROM rent_nov)) AS ls_car_nov
JOIN dc_sd_suv AS dc ON ls_car_nov.car_type = dc.car_type
WHERE
ROUND(daily_fee * @rent_for * (1 - discount_rate * 0.01)) >= 500000
AND ROUND(daily_fee * @rent_for * (1 - discount_rate * 0.01)) <= 2000000
ORDER BY fee DESC, car_type, car_id DESC
문제 바로가기(MySQL)
728x90
'코딩테스트연습(SQL)' 카테고리의 다른 글
570. Managers with at Least 5 Direct Reports / LeetCode, SQL, MS SQL Server (0) | 2023.04.04 |
---|---|
대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 / 프로그래머스, SQL, MySQL (0) | 2023.04.02 |
자동차 대여 기록 별 대여 금액 구하기 / 프로그래머스, SQL, MySQL (0) | 2023.03.27 |
저자 별 카테고리 별 매출액 집계하기 / 프로그래머스, SQL, MySQL (0) | 2023.03.26 |
카테고리 별 도서 판매량 집계하기 / 프로그래머스, SQL, MySQL (0) | 2023.03.23 |
Comments