02/13 SQL ๋ฌธ์ œํ’€์ด(๐ŸŒŸ๐ŸŒŸ๐ŸŒŸ๐ŸŒŸ๐ŸŒŸ)

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

1์ผ_1SQL

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

๋ฌธ์ œ

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




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

WITH TEMP_01 AS(
    SELECT A.HISTORY_ID, DATEDIFF(A.END_DATE, A.START_DATE) + 1 AS DAYS
    , CASE WHEN DATEDIFF(A.END_DATE, A.START_DATE) + 1 >= 90 THEN '90์ผ ์ด์ƒ'
           WHEN DATEDIFF(A.END_DATE, A.START_DATE) + 1 >= 30 THEN '30์ผ ์ด์ƒ'
           WHEN DATEDIFF(A.END_DATE, A.START_DATE) + 1 >= 7 THEN '7์ผ ์ด์ƒ'
           END AS DURATION
    , B.CAR_TYPE, B.DAILY_FEE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY A
    JOIN CAR_RENTAL_COMPANY_CAR B ON A.CAR_ID = B.CAR_ID
WHERE B.CAR_TYPE = 'ํŠธ๋Ÿญ'
)
SELECT A.HISTORY_ID
    , ROUND((DAILY_FEE * (1-COALESCE(B.DISCOUNT_RATE, 0)/100))*A.DAYS, 0) AS FEE
FROM TEMP_01 A
    LEFT JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN B ON A.CAR_TYPE = B.CAR_TYPE AND A.DURATION = B.DURATION_TYPE
ORDER BY FEE DESC, HISTORY_ID DESC
  • ์ฐจ๋Ÿ‰ ๋Œ€์—ฌ ์ •๋ณด ํ…Œ์ด๋ธ”๊ณผ(CAR_RENTAL_COMPANY_RENTAL_HISTORY), ์ฐจ๋Ÿ‰์ •๋ณด ํ…Œ์ด๋ธ” (CAR_RENTAL_COMPANY_CAR)์„ 'CAR_ID' ๊ธฐ์ค€์œผ๋กœ JOIN ํ•ด์ค€๋‹ค.

  • WHERE ์ ˆ์— ์ž๋™์ฐจ ์ข…๋ฅ˜(CAR_TYPE)๊ฐ€ 'ํŠธ๋Ÿญ'์ธ ๋ฐ์ดํ„ฐ๋งŒ ํ•„ํ„ฐ๋งํ•œ๋‹ค.

  • DATEDIFF(A.END_DATE, A.START_DATE) + 1์„ ์ด์šฉํ•ด ๋Œ€์—ฌ ์ผ์ˆ˜๋ฅผ ๊ตฌํ•ด์ฃผ๊ณ  ์ด๋ฅผ ๊ธฐ์ค€์œผ๋กœ '90์ผ ์ด์ƒ', '30์ผ ์ด์ƒ', '7์ผ ์ด์ƒ'์˜ DURATION ์ •๋ณด๋ฅผ CASE WHEN THEN์„ ์ด์šฉํ•ด ๊ตฌํ•œ๋‹ค.(๋Œ€์—ฌ์ผ, ๋ฐ˜๋‚ฉ์ผ ๋ชจ๋‘ ๋Œ€์—ฌ๊ธฐ๊ฐ„์— ํฌํ•จ๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ, ์–‘ ๊ฒฝ๊ณ„๊ฐ’ ํฌํ•จํ•˜๊ธฐ ์œ„ํ•ด +1 ํ•ด์คŒ)

  • ์œ„์—์„œ ๊ตฌํ•œ ํ…Œ์ด๋ธ”์„ TEMP_01๋กœ ๋งŒ๋“ ๋‹ค.

  • TEMP_01 ํ…Œ์ด๋ธ”๊ณผ ํ• ์ธ ์ •๋ณด๊ฐ€ ํฌํ•จ๋œ CAR_RENTAL_COMPANY_DISCOUNT_PLAN ํ…Œ์ด๋ธ”์„ CAR_TYPE๊ณผ ์œ„์—์„œ CASE๋ฌธ์œผ๋กœ ๊ตฌํ•œ DURATION์„ ๊ธฐ์ค€์œผ๋กœ LEFT JOIN ํ•ด ์ค€๋‹ค.

  • ๐ŸŒŸ๐ŸŒŸ๐ŸŒŸ(์™œ LEFT JOIN์ธ๊ฐ€? : 7์ผ ์ดํ•˜์˜ ๋Œ€์—ฌ ๊ธฐ๋ก๋„ ๊ตฌํ•ด์•ผ ํ•˜๋‹ˆ๊นŒ LEFT JOIN์ด๋‹ค. CAR_RENTAL_COMPANY_DISCOUNT_PLAN์—๋Š” 7์ผ ์ดํ•˜์˜ ํ• ์ธ์ •๋ณด๋Š” ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ƒฅ JOIN์„ ํ•  ๊ฒฝ์šฐ 7์ผ ์ดํ•˜์˜ ๋Œ€์—ฌ๊ธฐ๋ก์ด ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค.)

  • ๊ฐ DURATION์— ๋งž๋Š” ํ• ์ธ์œจ(DISCOUNT_RATE)๋ฅผ ๋ฐ˜์˜ํ•œ ๊ฐ€๊ฒฉ์„ ๊ตฌํ•ด์ค€๋‹ค.

  • DAILY_FEE*(1-COALESCE(DISCOUNT_RATE, 0)/100)*DAYS๋ฅผ ํ†ตํ•ด ๊ฐ ํ• ์ธ์œจ์„ ๋ฐ˜์˜ํ•œ ์ผ๋ณ„ ์š”๊ธˆ์„ ๊ตฌํ•˜๊ณ , ๋Œ€์—ฌ ์ผ์ˆ˜๋ฅผ ๊ณฑํ•ด์ค€๋‹ค. COALESCE๋ฅผ ์‚ฌ์šฉํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์— ํ• ์ธ์œจ์ด ์—†๋Š” ๋ฐ์ดํ„ฐ(์ฆ‰, 7์ผ ๋ฏธ๋งŒ์˜ ๋Œ€์—ฌ๊ธฐ๋ก)๋Š” ํ• ์ธ์ด ์—†๋Š” ๊ธˆ์•ก์„ ๊ตฌํ•˜๊ฒŒ ๋œ๋‹ค.

  • ์œ„์—์„œ ๊ตฌํ•œ ์ด ์š”๊ธˆ ์ปฌ๋Ÿผ์„ FEE ์ปฌ๋Ÿผ์œผ๋กœ ๋ณ„์นญ ์ค€๋‹ค.

  • ORDER BY๋ฅผ ์ด์šฉํ•ด FEE, HISTORY_ID ๊ธฐ์ค€์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌํ•œ๋‹ค.

  • ๐ŸŒŸ๐ŸŒŸ๐ŸŒŸ 1) LEFT JOIN๊ณผ JOIN์„ ๋น„๊ต,
    2) CASE WHEN THEN์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ˆœ์„œ,
    3) DAFE_DIFF๋ฅผ ํ†ตํ•ด ์ •ํ™•ํ•œ ๋Œ€์—ฌ ์ผ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฒ•
    4) COALESCE ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด NULL ๊ฐ’์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ
    5) TEMP_01 ๋“ฑ ์ž„์‹œ ํ…Œ์ด๋ธ”์„ ํ†ตํ•ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•
    ๋ชจ๋“  ๊ฒƒ์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋˜ ๋ฌธ์ œ์˜€๋‹ค. ์ค‘์š”์ค‘์š”!

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

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