SQL

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค level 4] ํŠน์ • ๊ธฐ๊ฐ„๋™์•ˆ ๋Œ€์—ฌ ๊ฐ€๋Šฅํ•œ ์ž๋™์ฐจ๋“ค์˜ ๋Œ€์—ฌ๋น„์šฉ ๊ตฌํ•˜๊ธฐ

1eehyunji 2023. 7. 26. 23:02

๋ฌธ์ œ ์„ค๋ช…

๋‹ค์Œ์€ ์–ด๋А ์ž๋™์ฐจ ๋Œ€์—ฌ ํšŒ์‚ฌ์—์„œ ๋Œ€์—ฌ ์ค‘์ธ ์ž๋™์ฐจ๋“ค์˜ ์ •๋ณด๋ฅผ ๋‹ด์€ 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์ ˆ์—์„œ ์กฐ๊ฑด์„ ์ ์šฉํ•ด์„œ ์ถ”์ถœํ–ˆ๋‹ค.