02/15 SQL ๋ฌธ์ œํ’€์ด(๐ŸŒŸ๐ŸŒŸ๐ŸŒŸ๐ŸŒŸ) - ํŠน์ • ๊ธฐ๊ฐ„๋™์•ˆ ๋Œ€์—ฌ ๊ฐ€๋Šฅํ•œ ์ž๋™์ฐจ๋“ค์˜ ๋Œ€์—ฌ๋น„์šฉ ๊ตฌํ•˜๊ธฐ / LV.4

Data Architect / Engineerยท2024๋…„ 2์›” 15์ผ
1

1์ผ_1SQL

๋ชฉ๋ก ๋ณด๊ธฐ
31/63
post-thumbnail

๋ฌธ์ œ

  • ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค SQL ๋ฌธ์ œ
  • ํŠน์ • ๊ธฐ๊ฐ„๋™์•ˆ ๋Œ€์—ฌ ๊ฐ€๋Šฅํ•œ ์ž๋™์ฐจ๋“ค์˜ ๋Œ€์—ฌ๋น„์šฉ ๊ตฌํ•˜๊ธฐ / ๋ ˆ๋ฒจ 4
  • ๋ฌธ์ œ ๋‚ด์šฉ : ํ•˜๋‹จ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฌธ์ œ [๋งํฌ]





๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ Query

WITH TEMP_01 AS(
SELECT B.CAR_ID, B.CAR_TYPE, B.DAILY_FEE,
      MAX(CASE WHEN A.END_DATE <= '2022-11-01' OR A.START_DATE >= '2022-11-30' THEN '๋Œ€์—ฌ๊ฐ€๋Šฅ'
           ELSE '๋Œ€์—ฌ๋ถˆ๊ฐ€๋Šฅ' END) AS ๋Œ€์—ฌ์—ฌ๋ถ€
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY A
    JOIN CAR_RENTAL_COMPANY_CAR B ON A.CAR_ID = B.CAR_ID
WHERE B.CAR_TYPE IN ('์„ธ๋‹จ', 'SUV')
GROUP BY CAR_ID
HAVING ๋Œ€์—ฌ์—ฌ๋ถ€ = '๋Œ€์—ฌ๊ฐ€๋Šฅ'
), TEMP_02 AS(
SELECT C.CAR_ID, C.CAR_TYPE
        , ROUND(C.DAILY_FEE * (1-D.DISCOUNT_RATE/100)*30, 0) AS FEE
FROM TEMP_01 C
    JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN D ON C.CAR_TYPE = D.CAR_TYPE
WHERE D.DURATION_TYPE = '30์ผ ์ด์ƒ'
ORDER BY FEE DESC, CAR_TYPE, CAR_ID DESC)
SELECT *
FROM TEMP_02
WHERE FEE BETWEEN 500000 AND 2000000
  • ๋จผ์ €, ์ฐจ๋Ÿ‰ ์ •๋ณด(CAR_RENTAL_COMPANY_CAR) ํ…Œ์ด๋ธ”๊ณผ ์ฐจ๋Ÿ‰ ๋Œ€์—ฌ ์ •๋ณด(CAR_RENTAL_COMPANY_RENTAL_HISTORY) ํ…Œ์ด๋ธ”์„ JOINํ•ด ์ค€๋‹ค.

  • WHERE ์ ˆ์—์„œ CAR_TYPE์ด '์„ธ๋‹จ', 'SUV'์ธ ์ฐจ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ํ•„ํ„ฐ๋งํ•ด์ค€๋‹ค.

  • ์ฐจ๋Ÿ‰ ID ๋ณ„๋กœ 2022-11-01 ~ 2022-11-30 ์— ๋Œ€์—ฌ๊ฐ€ ๊ฐ€๋Šฅํ•œ ์ฐจ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ์„ ํƒํ•˜๊ธฐ ์œ„ํ•ด์„œ ์šฐ์„  CAR_ID ๊ธฐ์ค€์œผ๋กœ GROUP BY ํ•ด ์ค€๋‹ค.

  • SELECT ์ ˆ์—์„œ, ๋Œ€์—ฌ ์—ฌ๋ถ€๋ผ๋Š” ์ปฌ๋Ÿผ์„ ๋งŒ๋“ค๊ณ  ์ฐจ๋Ÿ‰ ๊ธฐ๋ก์ค‘์— END_DATE๊ฐ€ '2022-11-01' ์ด์ „์ธ ๊ธฐ๋ก์ด๋‚˜ START_DATE๊ฐ€ '2022-11-30' ์ดํ›„์ธ ๋ฐ์ดํ„ฐ๋“ค์€ '๋Œ€์—ฌ ๊ฐ€๋Šฅ', ๊ทธ ์™ธ์— ๋ฐ์ดํ„ฐ๋Š” '๋Œ€์—ฌ๋ถˆ๊ฐ€๋Šฅ' ์ด๋ผ๊ณ  ์ถœ๋ ฅํ•ด์ค€๋‹ค.

  • MAX() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด, ์ฐจ๋Ÿ‰๋ณ„๋กœ ๋Œ€์—ฌ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ๊ฐ€ ํ•œ ๊ฑด์ด๋ผ๋„ ์žˆ๋Š” ์ฐจ๋Ÿ‰์€ '๋Œ€์—ฌ๋ถˆ๊ฐ€๋Šฅ'์ด ์ถœ๋ ฅ๋˜๋„๋ก ํ•ด ์ค€๋‹ค.

  • ์ •๋ฆฌ) ํ•œ ๋Œ€์˜ ์ฐจ๋Ÿ‰์ด๋ผ๋„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋Œ€์—ฌ ๊ธฐ๋ก (ํ˜น์€ ๋Œ€์—ฌ ์˜ˆ์ • ๊ธฐ๋ก) ์ด ์žˆ๋‹ค. ์ด ๊ธฐ๋ก๋“ค์„ '2022-11-01 ~ 2022-11-30' ๊ตฌ๊ฐ„ ๊ธฐ์ค€์œผ๋กœ, ๋Œ€์—ฌ๊ฐ€๋Šฅ / ๋Œ€์—ฌ๋ถˆ๊ฐ€๋Šฅ ์œผ๋กœ ๊ตฌ๋ถ„ํ•˜๊ณ , CAR_ID ๋ณ„๋กœ GROUP BY ํ›„ MAX() ํ•จ์ˆ˜๋ฅผ ์ ์šฉํ•ด์ฃผ๋ฉด, ํ•œ ๊ฑด์ด๋ผ๋„ ๋Œ€์—ฌ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ฐจ๋Ÿ‰์€ ๋Œ€์—ฌ ์—ฌ๋ถ€ ์ปฌ๋Ÿผ์— '๋Œ€์—ฌ๋ถˆ๊ฐ€๋Šฅ' ์ด๋ผ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•˜๊ฒŒ ๋œ๋‹ค. (์ฆ‰, 11์›”์— ๋Œ€์—ฌ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ฐจ๋Ÿ‰์€ '๋Œ€์—ฌ๋ถˆ๊ฐ€๋Šฅ', ๋Œ€์—ฌ๊ฐ€ ๊ฐ€๋Šฅํ•œ ์ฐจ๋Ÿ‰์€ '๋Œ€์—ฌ๊ฐ€๋Šฅ' ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.)

  • HAVING ์ ˆ์— ๋Œ€์—ฌ ์—ฌ๋ถ€๊ฐ€ '๋Œ€์—ฌ๊ฐ€๋Šฅ' ์ธ ์ฐจ๋Ÿ‰ ์ •๋ณด๋งŒ ํ•„ํ„ฐ๋งํ•œ๋‹ค.

  • ์œ„์—๊นŒ์ง€์˜ ํ…Œ์ด๋ธ”์„ TEMP_01๋กœ ์ง€์ •

  • ์ดํ›„ TEMP_01๊ณผ ํ• ์ธ ํ…Œ์ด๋ธ”(CAR_RENTAL_COMPANY_DISCOUNT_PLAN)์„ CAR_TYPE ๊ธฐ์ค€์œผ๋กœ JOIN ํ•œ๋‹ค.

  • ์—ฌ๋Ÿฌ ํ• ์ธ๋“ค ์ค‘, '30์ผ ์ด์ƒ' ํ• ์ธ ์ •๋ณด๋งŒ ์ถ”์ถœํ•˜๊ธฐ ์œ„ํ•ด WHERE์ ˆ์— DURATION_TYPE = '30์ผ ์ด์ƒ' ์กฐ๊ฑด์„ ์ค€๋‹ค.

  • ์ „์ฒด์ ์ธ ์š”๊ธˆ์„ ๊ณ„์‚ฐํ•ด์ค€๋‹ค. DAILY_FEE์— DISCOUNT_RATE๋ฅผ ์ ์šฉํ•œ ๊ธˆ์•ก์„ ๊ณฑํ•ด์ฃผ๊ณ , ROUND ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ์ •์ˆ˜๋ถ€๋ถ„๋งŒ ์ถœ๋ ฅํ•ด์ค€๋‹ค. ๊ธˆ์•ก์„ FEE ์ปฌ๋Ÿผ์œผ๋กœ ์ถœ๋ ฅํ•ด์ค€๋‹ค.

  • ORDER BY๋ฅผ ํ†ตํ•ด FEE ๋‚ด๋ฆผ์ฐจ์ˆœ, CAR_TYPE, CAR_ID ์ˆœ์œผ๋กœ ์ •๋ ฌํ•ด์ค€๋‹ค.

  • ์œ„์—๊นŒ์ง€์˜ ํ…Œ์ด๋ธ”์„ TEMP_02๋กœ ์ง€์ •

  • TEMP_02 ํ…Œ์ด๋ธ”์—์„œ FEE๊ฐ€ 50000 ~ 2000000 ์‚ฌ์ด์˜ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ๋ฐ์ดํ„ฐ๋งŒ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด WHERE์ ˆ์—์„œ ํ•ด๋‹น ์กฐ๊ฑด์„ ๊ฑธ์–ด์ค€๋‹ค.

  • ๐ŸŒŸ๐ŸŒŸ๐ŸŒŸ ์ฐจ๋Ÿ‰์ •๋ณด ํ…Œ์ด๋ธ”๊ณผ ์ฐจ๋Ÿ‰๋Œ€์—ฌ๊ธฐ๋ก ํ…Œ์ด๋ธ”์€ 1:M ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง„๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ™์€ ์ฐจ๋Ÿ‰์ด๋ผ๋„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋Œ€์—ฌ ๊ธฐ๋ก(๋Œ€์—ฌ ์˜ˆ์ • ๊ธฐ๋ก) ์ด ์žˆ๋‹ค. ์ด๋ฅผ GROUP BY๋ฅผ ํ†ตํ•ด '์ฐจ๋Ÿ‰๋ณ„' ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌํ•ด์ค˜์•ผ ํ•˜๋Š”๋ฐ, 11์›” ๊ธฐ๊ฐ„์— ๋Œ€์—ฌ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ฐจ๋Ÿ‰์„ ์ฐพ๊ธฐ ์œ„ํ•ด CASE WHEN์„ ํ†ตํ•ด ๋Œ€์—ฌ ์—ฌ๋ถ€๋ฅผ ๊ตฌํ•ด์ฃผ์—ˆ๊ณ , GROUP BY ํ–ˆ์„ ๋•Œ ๋Œ€์—ฌ์—ฌ๋ถ€๊ฐ€ '๋Œ€์—ฌ๋ถˆ๊ฐ€๋Šฅ'์ธ ์ฐจ๋Ÿ‰์€ '๋Œ€์—ฌ๋ถˆ๊ฐ€๋Šฅ' ๊ฐ’์ด ๋Œ€ํ‘œ๊ฐ’์ด ๋˜๋„๋ก MAX() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์ฃผ์—ˆ๋‹ค.

profile
์งˆ๋ฌธ์€ ๊ณ„์†๋ผ ์•„์˜ค์—

0๊ฐœ์˜ ๋Œ“๊ธ€