๐ข ๋ณธ ํฌ์คํ ์ ํ์ฉ๋๋ ๊ธฐ๋ณธ ๋ฌธ์ ๋ฐ ์๋ฃ ์ถ์ฒ๋
ํ๋ก๊ทธ๋๋จธ์ค ์ฝ๋ฉํ ์คํธ ์ฐ์ต,
https://school.programmers.co.kr/learn/challenges?page=1&languages=mysql%2Coracle์์ ๋ฐํ๋๋ค.
· ๋ณธ ๋ฌธ์ https://school.programmers.co.kr/learn/courses/30/lessons/157339
โ ๋ฌธ์
๋ฌธ์ ์ค๋ช
๋ค์์ ์ด๋ ์๋์ฐจ ๋์ฌ ํ์ฌ์์ ๋์ฌ ์ค์ธ ์๋์ฐจ๋ค์ ์ ๋ณด๋ฅผ ๋ด์ CAR_RENTAL_COMPANY_CAR ํ ์ด๋ธ๊ณผ ์๋์ฐจ ๋์ฌ ๊ธฐ๋ก ์ ๋ณด๋ฅผ ๋ด์ CAR_RENTAL_COMPANY_RENTAL_HISTORY ํ ์ด๋ธ๊ณผ ์๋์ฐจ ์ข ๋ฅ ๋ณ ๋์ฌ ๊ธฐ๊ฐ ์ข ๋ฅ ๋ณ ํ ์ธ ์ ์ฑ ์ ๋ณด๋ฅผ ๋ด์ CAR_RENTAL_COMPANY_DISCOUNT_PLAN ํ ์ด๋ธ ์ ๋๋ค.
CAR_RENTAL_COMPANY_CAR ํ ์ด๋ธ์ ์๋์ ๊ฐ์ ๊ตฌ์กฐ๋ก ๋์ด์์ผ๋ฉฐ, CAR_ID, CAR_TYPE, DAILY_FEE, OPTIONS ๋ ๊ฐ๊ฐ ์๋์ฐจ ID, ์๋์ฐจ ์ข ๋ฅ, ์ผ์ผ ๋์ฌ ์๊ธ(์), ์๋์ฐจ ์ต์ ๋ฆฌ์คํธ๋ฅผ ๋ํ๋ ๋๋ค.
Column name | Type | Nullable |
CAR_ID | INTEGER | FALSE |
CAR_TYPE | VARCHAR(255) | FALSE |
DAILY_FEE | INTEGER | FALSE |
OPTIONS | VARCHAR(255) | FALSE |
์๋์ฐจ ์ข ๋ฅ๋ '์ธ๋จ', 'SUV', '์นํฉ์ฐจ', 'ํธ๋ญ', '๋ฆฌ๋ฌด์ง' ์ด ์์ต๋๋ค. ์๋์ฐจ ์ต์ ๋ฆฌ์คํธ๋ ์ฝค๋ง(',')๋ก ๊ตฌ๋ถ๋ ํค์๋ ๋ฆฌ์คํธ(์: ''์ด์ ์ํธ,์ค๋งํธํค,์ฃผ์ฐจ๊ฐ์ง์ผ์'')๋ก ๋์ด์์ผ๋ฉฐ, ํค์๋ ์ข ๋ฅ๋ '์ฃผ์ฐจ๊ฐ์ง์ผ์', '์ค๋งํธํค', '๋ค๋น๊ฒ์ด์ ', 'ํตํ์ํธ', '์ด์ ์ํธ', 'ํ๋ฐฉ์นด๋ฉ๋ผ', '๊ฐ์ฃฝ์ํธ' ๊ฐ ์์ต๋๋ค.
CAR_RENTAL_COMPANY_RENTAL_HISTORY ํ ์ด๋ธ์ ์๋์ ๊ฐ์ ๊ตฌ์กฐ๋ก ๋์ด์์ผ๋ฉฐ, HISTORY_ID, CAR_ID, START_DATE, END_DATE ๋ ๊ฐ๊ฐ ์๋์ฐจ ๋์ฌ ๊ธฐ๋ก ID, ์๋์ฐจ ID, ๋์ฌ ์์์ผ, ๋์ฌ ์ข ๋ฃ์ผ์ ๋ํ๋ ๋๋ค.
Column name | Type | Nullable |
HISTORY_ID | INTEGER | FALSE |
CAR_ID | INTEGER | FALSE |
START_DATE | DATE | FALSE |
END_DATE | DATE | FALSE |
CAR_RENTAL_COMPANY_DISCOUNT_PLAN ํ ์ด๋ธ์ ์๋์ ๊ฐ์ ๊ตฌ์กฐ๋ก ๋์ด์์ผ๋ฉฐ, PLAN_ID, CAR_TYPE, DUTAION_TYPE, DISCOUNT_RATE ๋ ๊ฐ๊ฐ ์๊ธ ํ ์ธ ์ ์ฑ ID, ์๋์ฐจ ์ข ๋ฅ, ๋์ฌ ๊ธฐ๊ฐ ์ข ๋ฅ, ํ ์ธ์จ(%)์ ๋ํ๋ ๋๋ค.
Column name | Type | Nullable |
PLAN_ID | INTEGER | FALSE |
CAR_TYPE | VARCHAR(255) | FALSE |
DURATION_TYPE | VARCHAR(255) | FALSE |
DISCOUNT_RATE | INTEGER | FALSE |
๋ฌธ์
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๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌํด์ฃผ์ธ์.
โ ํ์ด
๋ฌธ์ ์๊ตฌ์ฌํญ
์๋์ฐจ ์ข ๋ฅ๊ฐ '์ธ๋จ' ๋๋ 'SUV' ์ธ ์๋์ฐจ ์ค ¹
2022๋ 11์ 1์ผ๋ถํฐ 2022๋ 11์ 30์ผ๊น์ง ๋์ฌ ๊ฐ๋ฅ²ํ๊ณ
30์ผ๊ฐ์ ๋์ฌ ๊ธ์ก์ด 50๋ง์ ์ด์ 200๋ง์ ๋ฏธ๋ง์ธ ์๋์ฐจ ³์ ๋ํด์ < ๋ด์ฉ์กฐ๊ฑด 1, 2, 3
์๋์ฐจ ID, ์๋์ฐจ ์ข ๋ฅ, ๋์ฌ ๊ธ์ก(์ปฌ๋ผ๋ช : FEE) ๋ฆฌ์คํธ๋ฅผ ์ถ๋ ฅํ๋ SQL๋ฌธ์ ์์ฑ
๊ฒฐ๊ณผ๋ ๋์ฌ ๊ธ์ก์ ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌํ๊ณ , < ์ ๋ ฌ์กฐ๊ฑด1
๋์ฌ ๊ธ์ก์ด ๊ฐ์ ๊ฒฝ์ฐ ์๋์ฐจ ์ข ๋ฅ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌ, < ์ ๋ ฌ์กฐ๊ฑด2
์๋์ฐจ ์ข ๋ฅ๊น์ง ๊ฐ์ ๊ฒฝ์ฐ ์๋์ฐจ ID๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ < ์ ๋ ฌ์กฐ๊ฑด3
๋ด์ฉ์กฐ๊ฑด2 ์ ํด๋นํ๋ CAR_ID๋ฅผ ๋ฝ์๋ด๋ ๊ฒ์ด ๊ด๊ฑด์ธ ๋ฌธ์ ์๋ค.
์ฒ์์ START_DATE์ END_DATE๋ฅผ WHERE์ OR ์กฐ๊ฑด์ผ๋ก ๋๊ณ ์ถ๋ ฅํด๋ดค๋๋ฐ ์กฐ๊ฑด์ ๋ถํฉํ๋ CAR_ID๊ฐ ์ถ๋ ฅ๋์ง ์๋ ๊ฑธ ํ์ธํ๋ค.
๊ทธ๋์ ์ธ๋จ์ด๊ฑฐ๋ SUV ์ธ ๋ฐ์ดํฐ๊ฐ¹์ CAR_ID๋ก ๊ทธ๋ฃนํํด์ ๊ฐ์ฅ ์ต๊ทผ ์์๋ ์ง๊ฐ ์ต์ 12์ 1์ผ์ด๊ฑฐ๋ ์ต๊ทผ ๋์ฌ ์ข ๋ฃ ๋ ์ง๊ฐ 10์ 31์ผ์ธ CAR_ID๋ฅผ ํฌํจํ๋² ์ด๋ผ๋ ์กฐ๊ฑด์ ๋ฉ์ธ์ฟผ๋ฆฌ WHERE์ ์กฐ๊ฑด 1
ํ ์ธ์จ(CAR_TYPE๋ณ ๋์ฌ๊ธฐ๊ฐ 30์ผ ์ด์ ์กฐ๊ฑด)์ ๋ฉ์ธ์ฟผ๋ฆฌ WHERE์ ์กฐ๊ฑด 2 ๋ฃ์ด์ฃผ์๋ค.
SELECT์ ์์ ์ถ๋ ฅ๋๋ CAR_ID๋ณ FEE๋ฅผ ๊ณ์ฐํ๊ณ ๋ ํ์ HAVING์ ์์ ์กฐ๊ฑด ³
์ ์ฉํ๊ณ ๋ง์ง๋ง์ผ๋ก ์ ๋ ฌ์กฐ๊ฑด 1~3์ ์ ์ฉํด์ฃผ์๋ค.
SELECT DISTINCT CRCC.CAR_ID AS CAR_ID
, CRCC.CAR_TYPE AS CAR_TYPE
, FLOOR(CRCC.DAILY_FEE * 30 * (0.01*(100- CRCDP.DISCOUNT_RATE))) AS FEE
FROM CAR_RENTAL_COMPANY_CAR CRCC
LEFT JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY CRCRH
ON CRCC.CAR_ID = CRCRH.CAR_ID
LEFT JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN CRCDP
ON CRCC.CAR_TYPE = CRCDP.CAR_TYPE
WHERE CRCC.CAR_ID IN (SELECT CH.CAR_ID
FROM CAR_RENTAL_COMPANY_CAR CC
LEFT JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY CH
ON CH.CAR_ID = CC.CAR_ID
WHERE CC.CAR_TYPE IN ('์ธ๋จ','SUV')
GROUP BY 1
HAVING MAX(START_DATE) > '2022-11-30 23:59:59'
OR MAX(END_DATE) < '2022-11-01 00:00:00')
AND CRCDP.DURATION_TYPE = '30์ผ ์ด์'
HAVING FEE >= 500000 AND FEE < 2000000
ORDER BY 3 DESC, 2, 1 DESC
;