๐Ÿ’ SQL/Join

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

์„ ๋‹ฌ 2023. 7. 27. 19:25
๋ฐ˜์‘ํ˜•

https://school.programmers.co.kr/learn/courses/30/lessons/157339

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

 

๋ฌธ์ œ

CAR_RENTAL_COMPANY_CAR ํ…Œ์ด๋ธ”๊ณผ CAR_RENTAL_COMPANY_RENTAL_HISTORY ํ…Œ์ด๋ธ”๊ณผ CAR_RENTAL_COMPANY_DISCOUNT_PLAN ํ…Œ์ด๋ธ”์—์„œ 

 

1. ์ž๋™์ฐจ ์ข…๋ฅ˜๊ฐ€ '์„ธ๋‹จ' ๋˜๋Š” 'SUV' ์ธ ์ž๋™์ฐจ ์ค‘ 

2. 2022๋…„ 11์›” 1์ผ๋ถ€ํ„ฐ 2022๋…„ 11์›” 30์ผ๊นŒ์ง€ ๋Œ€์—ฌ ๊ฐ€๋Šฅํ•˜๊ณ  

3. 30์ผ๊ฐ„์˜ ๋Œ€์—ฌ ๊ธˆ์•ก์ด 50๋งŒ์› ์ด์ƒ 200๋งŒ์› ๋ฏธ๋งŒ์ธ ์ž๋™์ฐจ์— ๋Œ€ํ•ด์„œ 

 

์ž๋™์ฐจ ID, ์ž๋™์ฐจ ์ข…๋ฅ˜, ๋Œ€์—ฌ ๊ธˆ์•ก(์ปฌ๋Ÿผ๋ช…: FEE) ๋ฆฌ์ŠคํŠธ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” SQL๋ฌธ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”. 

 

๊ฒฐ๊ณผ๋Š” ๋Œ€์—ฌ ๊ธˆ์•ก์„ ๊ธฐ์ค€์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌํ•˜๊ณ , ๋Œ€์—ฌ ๊ธˆ์•ก์ด ๊ฐ™์€ ๊ฒฝ์šฐ ์ž๋™์ฐจ ์ข…๋ฅ˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ, ์ž๋™์ฐจ ์ข…๋ฅ˜๊นŒ์ง€ ๊ฐ™์€ ๊ฒฝ์šฐ ์ž๋™์ฐจ ID๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌํ•ด์ฃผ์„ธ์š”.

 

ํ’€์ด

์šฐ์„  ์„ธ๊ฐ€์ง€ ํ…Œ์ด๋ธ”์„ ์ „๋ถ€ ์กฐ์ธํ•ด์ฃผ๊ณ  (inner๊ฐ€ ์•„๋‹Œ left์ž„์— ์ฃผ์˜)

where๋กœ 1๋ฒˆ๊ณผ 2๋ฒˆ ์กฐ๊ฑด์„ ํ•„ํ„ฐ๋งํ•ด์ฃผ๋Š” ๋ถ€๋ถ„๊นŒ์ง€๋Š” ์‰ฝ๊ฒŒ ๊ฐ€๋Šฅํ•˜๋‹ค

 

3๋ฒˆ ์กฐ๊ฑด์˜ ๊ฒฝ์šฐ ์‚ด์ง ๋” ์ƒ๊ฐ์„ ํ•ด์ค˜์•ผํ•œ๋‹ค.

start date์™€ ์ƒ๊ด€์—†์ด ๊ฐ€์žฅ ์ตœ๊ทผ ๊ธฐ๋ก์˜ end date๊ฐ€ 2022๋…„ 11์›” 01์ผ ์ด์ „์ด๊ธฐ๋งŒ ํ•˜๋ฉด ๋Œ€์—ฌ ๊ฐ€๋Šฅํ•˜๋‹ค

์ด๋•Œ ํ•œ๊ฐ€์ง€ ์ฐจ์— ๋Œ€ํ•ด ๊ธฐ๋ก์ด ์—ฌ๋Ÿฌ๊ฐœ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ group by๋ฅผ ํ•ด์ฃผ๊ณ  having์œผ๋กœ ๊ฐ€์žฅ ์ตœ๊ทผ์˜ end date๋กœ ์กฐ๊ฑด์„ ๊ฑธ์–ด์ฃผ์ž

 

select c.car_id, c.car_type,
    floor(c.daily_fee*30*(100-p.discount_rate)/100) as fee
from car_rental_company_car c
    left join car_rental_company_rental_history h on c.car_id = h.car_id
    left join car_rental_company_discount_plan p on c.car_type = p.car_type
where duration_type = "30์ผ ์ด์ƒ"
    and (c.car_type = '์„ธ๋‹จ' or c.car_type = 'SUV')
    and c.daily_fee*30*(100-p.discount_rate) between 50000000 and 200000000
group by c.car_id
    having max(date_format(h.end_date, "%Y%m%d")) < "20221101"
order by fee desc, c.car_type asc, c.car_id desc
๋ฐ˜์‘ํ˜•