Skip to main content

๐Ÿš— [SQL] 151138 ์ž๋™์ฐจ ๋Œ€์—ฌ ๊ธฐ๋ก์—์„œ ์žฅ๊ธฐ/๋‹จ๊ธฐ ๋Œ€์—ฌ ๊ตฌ๋ถ„ํ•˜๊ธฐ


ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค [SQL] ์ž๋™์ฐจ ๋Œ€์—ฌ ๊ธฐ๋ก์—์„œ ์žฅ๊ธฐ/๋‹จ๊ธฐ ๋Œ€์—ฌ ๊ตฌ๋ถ„ํ•˜๊ธฐ

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

1. ๋ฌธ์ œ

  • car_rental_company_car, car_rental_company_rental_history, car_rental_company_discount_plan ํ…Œ์ด๋ธ” ์ œ๊ณต
  • '์„ธ๋‹จ', 'SUV' ์ฐจ์ข… ์ค‘ 2022๋…„ 11์›” ํ•œ ๋‹ฌ ๊ฐ„ ๋Œ€์—ฌ ๊ฐ€๋Šฅํ•œ ์ฐจ๋Ÿ‰์„ ์ฐพ๊ณ , 30์ผ ์š”๊ธˆ ๊ธฐ์ค€ ์ •๋ ฌ

2. ์‹คํŒจํ•œ ์‹œ๋„

โŒ ์˜ค๋‹ต

SELECT j.car_id, j.car_type, j.daily_fee * ((100 - j.discount_rate)*0.01) * 30 AS fee
FROM (car_rental_company_car c INNER JOIN car_rental_company_discount_plan d ON c.car_type = d.car_type) AS j
     INNER JOIN car_rental_company_rental_history h ON j.car_id = h.car_id
WHERE car_type = '์„ธ๋‹จ' OR 'SUV' AND h.end_date < '2024-11-01'
ORDER BY fee DESC, j.car_type, j.car_id DESC

โœ…ย SQL WHERE ์ ˆ์—์„œ ๋…ผ๋ฆฌ ์˜ค๋ฅ˜ ์ฃผ์˜

  • 'SUV' ๋‹จ๋…์€ ํ•ญ์ƒ true ๋กœ ์ธ์‹๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ชจ๋“  car_type์ด ํฌํ•จ๋œ๋‹ค.
  • โ†’ IN ('์„ธ๋‹จ', 'SUV') ์‚ฌ์šฉํ•ด์•ผ ์ •ํ™•ํ•˜๋‹ค.

โœ… ๋‚ ์งœ ์กฐ๊ฑด์„ ๋ถ€์ •ํ™•ํ•˜๊ฒŒ ์ž‘์„ฑํ•จ

  • ๋‚ ์งœ ๋ฒ”์œ„ ํ•„ํ„ฐ๋ง์‹œ NOT EXISTS ์‚ฌ์šฉํ•œ๋‹ค.
  • ๊ฒน์น˜๋Š” ๋‚ ์งœ ์กฐ๊ฑด์„ ๋ถ€์ •ํ•ด์„œ ์ œ์™ธํ•  ์ฐจ๋Ÿ‰์„ ์ •์˜ํ•ด์•ผ ํ•จ
  • ๊ธฐ๊ฐ„ ๊ฒน์นจ ํ™•์ธ์€ NOT (end < ์‹œ์ž‘ OR start > ์ข…๋ฃŒ)๋กœ ๋ถ€์ •

โœ… GROUP BY๋Š” ์ค‘๋ณต ๋ฐฉ์ง€์šฉ์ด ์•„๋‹ˆ๋‹ค.

  • ๋ฌธ์ œ์—์„œ ์š”๊ตฌํ•˜์ง€ ์•Š๋Š” ์ด์ƒ, JOIN ๊ฒฐ๊ณผ ์ค‘๋ณต ๋ฐœ์ƒ ์›์ธ์„ ๋จผ์ € ์ ๊ฒ€ํ•  ๊ฒƒ

โœ… ROUND ํ•จ์ˆ˜๋กœ ์‹ค์ˆ˜์ฒ˜๋ฆฌํ•œ๋‹ค.

  • ๊ณ„์‚ฐ์‹ ๊ฒฐ๊ณผ๋Š” ์‹ค์ˆ˜์ด๋‹ค. โ†’ ROUND()๋กœ ์ •์ˆ˜ ๋ณ€ํ™˜์ด ํ•„์š”ํ•˜๋‹ค.

3. ์ •๋‹ต ์ฝ”๋“œ

SELECT j.car_id, j.car_type, ROUND(j.daily_fee * ((100 - j.discount_rate)*0.01) * 30) AS fee
FROM (
    SELECT c.car_id, c.car_type, c.daily_fee, d.discount_rate
    FROM car_rental_company_car c
    INNER JOIN car_rental_company_discount_plan d
    ON c.car_type = d.car_type AND d.duration_type = '30์ผ ์ด์ƒ') AS j
WHERE car_type IN ('์„ธ๋‹จ', 'SUV')
AND NOT EXISTS (
    SELECT 1
    FROM car_rental_company_rental_history h2
    WHERE h2.car_id = j.car_id
    AND NOT (h2.end_date < '2022-11-01' OR h2.start_date > '2022-11-30')
)
ORDER BY fee DESC, j.car_type, j.car_id DESC;
  • NOT EXISTS ์ ˆ์—์„œ "11์›” ํ•œ ๋‹ฌ์ด๋ผ๋„ ๋Œ€์—ฌ๋œ ์ฐจ๋Š” ์ œ์™ธ"
  • ๋‚ ์งœ ๋ฒ”์œ„: NOT (end < 11์›” 1์ผ OR start > 11์›” 30์ผ) โ†’ ๊ฒน์น˜๋Š” ๋Œ€์—ฌ๊ธฐ๊ฐ„ ํ•„ํ„ฐ๋ง
  • ํ• ์ธ ์กฐ๊ฑด: duration_type = '30์ผ ์ด์ƒ'
  • ์š”๊ธˆ: ROUND() ํ•จ์ˆ˜๋กœ ์ •์ˆ˜ ์ฒ˜๋ฆฌ

๐Ÿ“Œ TMI:

  • ๋ณต์žกํ•œ SQL์ผ์ˆ˜๋ก ์ ์ง„์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๋ฉด์„œ WHERE์ ˆ ์กฐ๊ฑด์„ ๋ช…ํ™•ํžˆ ํŒŒ์•…ํ•ด์•ผ ํ•จ.