[ํ๋ก๊ทธ๋๋จธ์ค level 4] ํน์ ๊ธฐ๊ฐ๋์ ๋์ฌ ๊ฐ๋ฅํ ์๋์ฐจ๋ค์ ๋์ฌ๋น์ฉ ๊ตฌํ๊ธฐ
๋ฌธ์ ์ค๋ช
๋ค์์ ์ด๋ ์๋์ฐจ ๋์ฌ ํ์ฌ์์ ๋์ฌ ์ค์ธ ์๋์ฐจ๋ค์ ์ ๋ณด๋ฅผ ๋ด์ 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 nameTypeNullable
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 nameTypeNullable
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, DURATION_TYPE, DISCOUNT_RATE ๋ ๊ฐ๊ฐ ์๊ธ ํ ์ธ ์ ์ฑ ID, ์๋์ฐจ ์ข ๋ฅ, ๋์ฌ ๊ธฐ๊ฐ ์ข ๋ฅ, ํ ์ธ์จ(%)์ ๋ํ๋ ๋๋ค.
Column nameTypeNullable
PLAN_ID | INTEGER | FALSE |
CAR_TYPE | VARCHAR(255) | FALSE |
DURATION_TYPE | VARCHAR(255) | FALSE |
DISCOUNT_RATE | INTEGER | FALSE |
ํ ์ธ์จ์ด ์ ์ฉ๋๋ ๋์ฌ ๊ธฐ๊ฐ ์ข ๋ฅ๋ก๋ '7์ผ ์ด์' (๋์ฌ ๊ธฐ๊ฐ์ด 7์ผ ์ด์ 30์ผ ๋ฏธ๋ง์ธ ๊ฒฝ์ฐ), '30์ผ ์ด์' (๋์ฌ ๊ธฐ๊ฐ์ด 30์ผ ์ด์ 90์ผ ๋ฏธ๋ง์ธ ๊ฒฝ์ฐ), '90์ผ ์ด์' (๋์ฌ ๊ธฐ๊ฐ์ด 90์ผ ์ด์์ธ ๊ฒฝ์ฐ) ์ด ์์ต๋๋ค. ๋์ฌ ๊ธฐ๊ฐ์ด 7์ผ ๋ฏธ๋ง์ธ ๊ฒฝ์ฐ ํ ์ธ์ ์ฑ ์ด ์์ต๋๋ค.
๋ฌธ์
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๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌํด์ฃผ์ธ์.
๋ฌธ์ ํ์ด
SELECT C.CAR_ID, C.CAR_TYPE, ROUND(C.DAILY_FEE*30*(100-P.DISCOUNT_RATE)/100) AS FEE FROM CAR_RENTAL_COMPANY_CAR AS C
JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY AS H ON C.CAR_ID=H.CAR_ID
JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN AS P ON C.CAR_TYPE=P.CAR_TYPE
WHERE C.CAR_ID NOT IN (SELECT CAR_ID FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE<'2022-11-30' AND END_DATE>'2022-11-01')
AND C.CAR_TYPE IN ('์ธ๋จ','SUV')
AND P.DURATION_TYPE='30์ผ ์ด์'
GROUP BY C.CAR_ID
HAVING FEE BETWEEN 500000 AND 1999999
ORDER BY FEE DESC, C.CAR_TYPE, C.CAR_ID DESC;
์กฐ๊ฑด์ด ๊ฝค๋ ๋ณต์กํด์ ๋ฌธ์ ๋ฅผ ํธ๋๋ฐ ์ค๋ ๊ฑธ๋ ธ๋ค..!
1. ์ฐ์ ์กฐ์ธ์ ๋ ๋ฒ ํด์ผ ํ๋ค. CAR_RENTAL_COMPANY_CAR ํ ์ด๋ธ๊ณผ CAR_RENTAL_COMPANY_RENTAL_HISTORY ํ ์ด๋ธ์ CAR_ID๋ฅผ ๊ธฐ์ค์ผ๋ก ์กฐ์ธํ๊ณ , CAR_RENTAL_COMPANY_CAR ํ ์ด๋ธ๊ณผ CAR_RENTAL_COMPANY_DISCOUNT_PLAN ํ ์ด๋ธ์ CAR_TYPE์ ๊ธฐ์ค์ผ๋ก ์กฐ์ธํ๋ค.
2. ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ด์ฉํด์ 2022-11-01๋ถํฐ 2022-11-30 ์ฌ์ด์ ๋์ฌ ์ค์ธ ์๋์ฐจ ์์ด๋๋ฅผ ๋ฝ์๋ด๊ณ , NOT IN์ ์ด์ฉํด์ CAR_ID๊ฐ ์ด ์๋ธ์ฟผ๋ฆฌ ๋ฐ์ดํฐ์ ํด๋นํ์ง ์๋ ๋ฐ์ดํฐ๋ง ์ถ์ถํ๋ค.
3. CAR_TYPE์ด ์ธ๋จ์ด๊ฑฐ๋ SUV์ธ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๋ค.
4. ํ ์ธ ์ ์ฉ ๋์ฌ๊ธฐ๊ฐ์ด 30์ผ ์ด์์ธ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๋ค.
5. CAR_ID๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ทธ๋ฃนํํ ๋ค์ 30์ผ ๊ฐ์ ๋์ฌ ๊ธ์ก์ ์ถ์ถํ๊ณ , ๋์ฌ ๊ธ์ก์ด 50๋ง์ ์ด์ 200๋ง์ ๋ฏธ๋ง์ธ ๊ฒฝ์ฐ์ธ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๋ค.
์ฌ๊ธฐ์ FEE๋ก ๋ณ์นญ์ ๋ถ์ฌ๋ ์ปฌ๋ผ์ด WHERE์ ์์ ์กฐ๊ฑด์ ์ ์ฉํด์ ๊ตฌํ ์ ์๊ธฐ ๋๋ฌธ์ CAR_ID๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ทธ๋ฃนํํ ๋ค์ HAVING์ ์์ ์กฐ๊ฑด์ ์ ์ฉํด์ ์ถ์ถํ๋ค.