๐ 157339. ์๋์ฐจ ๋์ฌ ๊ธฐ๋ก์์ ์ฅ๊ธฐ/๋จ๊ธฐ ๋์ฌ ๊ตฌ๋ถํ๊ธฐ (SQL)
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
- ์ค๋ฅ:
'SUV'
๋ ํญ์ true๋ก ์ธ์๋จ โ ๋ชจ๋ car_type ํฌํจ๋จ - ๋ ์ง ์กฐ๊ฑด ๋ถ์ ํ
โ ๋ ๋ฒ์งธ ์๋
FROM (SELECT * FROM ... ) AS j ...
- ๊ตฌ์กฐ๋ง ๋ฐ๊ฟจ์ ๋ฟ ๋ ผ๋ฆฌ์ ์ค๋ฅ ๋์ผ
โ ์ธ ๋ฒ์งธ ์๋
FROM (SELECT c.car_id, c.car_type, c.daily_fee, d.discount_rate FROM ... ) AS j ...
- ๊ณ์ฐ์ ๋ง์์ง๋ง ์ค์๊ฐ ์ถ๋ ฅ โ
ROUND()
ํ์ car_id
์ค๋ณต โGROUP BY
ํ์
โ ๋ค ๋ฒ์งธ ์๋
... GROUP BY car_id ...
- WHERE์ ์ค๋ฅ ๊ณ์๋จ (
car_type = '์ธ๋จ' OR 'SUV'
๋ฌธ์ )
โ ๋ค์ฏ ๋ฒ์งธ ์๋
WHERE car_type IN ('์ธ๋จ', 'SUV') AND h.end_date < '2024-11-01'
- WHERE ์ ์ค๋ฅ ์์ ์ฑ๊ณต
- ํ์ง๋ง ํต์ฌ ์กฐ๊ฑด ๋น ์ง โ 11์ ํ ๋ฌ "๋์ฌ ๋ถ๊ฐํ ์ฐจ๋"์ ์ ์ธํด์ผ ํจ
โ ์ฌ์ฏ ๋ฒ์งธ ์๋
... AND d.duration_type = '30์ผ ์ด์'
... AND h.start_date <= '2022-11-01' AND h.end_date >= '2022-11-30'
- ๋์ฌ์ค์ธ ์ฐจ๋๋ง ํฌํจ๋๋ ์ค๋ฅ โ ์ ์ธ ์กฐ๊ฑด์ด ์๋ ํฌํจ ์กฐ๊ฑด์ด ๋จ
โ ์ผ๊ณฑ ๋ฒ์งธ ์๋
WHERE car_type IN (...) AND (SELECT car_id FROM ...)
- WHERE ์ ์ ์๋ธ์ฟผ๋ฆฌ ๋จ๋ ์ฌ์ฉ โ ๋ค์คํ ์ค๋ฅ ๋ฐ์
โ ์ฌ๋ ๋ฒ์งธ ์๋
WHERE car_type IN (...) AND NOT EXISTS (SELECT ...)
- ์ฒ์์ ์กฐ๊ฑด ๋ถ์์ ํ์ (j.car_id ์ฐ๋ ์๋จ)
โ ์ํ ๋ฒ์งธ ์๋ (์ฑ๊ณต)
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()
ํจ์๋ก ์ ์ ์ฒ๋ฆฌ
3. ๊ตํ ๋ฐ ํฌ์ธํธ ์ ๋ฆฌ
3.1 SQL WHERE ์ ์์ ๋ ผ๋ฆฌ ์ค๋ฅ ์ฃผ์
'SUV'
๋จ๋ ์ ํญ์ true โIN ('์ธ๋จ', 'SUV')
์ฌ์ฉํด์ผ ์ ํ
3.2 ๋ ์ง ๋ฒ์ ํํฐ๋ง ์ NOT EXISTS
์ฌ์ฉ ํ
- ๊ฒน์น๋ ๋ ์ง ์กฐ๊ฑด์ ๋ถ์ ํด์ ์ ์ธํ ์ฐจ๋์ ์ ์ํด์ผ ํจ
- ๊ธฐ๊ฐ ๊ฒน์นจ ํ์ธ์
NOT (end < ์์ OR start > ์ข ๋ฃ)
๋ก ๋ถ์
3.3 GROUP BY๋ ์ค๋ณต ๋ฐฉ์ง์ฉ ์๋
- ๋ฌธ์ ์์ ์๊ตฌํ์ง ์๋ ์ด์, JOIN ๊ฒฐ๊ณผ ์ค๋ณต ๋ฐ์ ์์ธ์ ๋จผ์ ์ ๊ฒํ ๊ฒ
3.4 ROUND ํจ์๋ก ์ค์ ์ฒ๋ฆฌ
- ๊ณ์ฐ์ ๊ฒฐ๊ณผ๋ ์ค์ โ
ROUND()
๋ก ์ ์ ๋ณํ ํ์
๐ TMI:
- ๋ณต์กํ SQL์ผ์๋ก ์ ์ง์ ์ผ๋ก ํ ์คํธํ๋ฉด์ WHERE์ ์กฐ๊ฑด์ ๋ช ํํ ํ์ ํด์ผ ํจ.