Growth ๐ŸŒณ/Practice ๐Ÿ’ป

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

์ธ” 2023. 3. 18. 15:46

๐Ÿ“ข ๋ณธ ํฌ์ŠคํŒ…์— ํ™œ์šฉ๋˜๋Š” ๊ธฐ๋ณธ ๋ฌธ์ œ ๋ฐ ์ž๋ฃŒ ์ถœ์ฒ˜๋Š”

       ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต,   

      https://school.programmers.co.kr/learn/challenges?page=1&languages=mysql%2Coracle์ž„์„ ๋ฐํž™๋‹ˆ๋‹ค.

      · ๋ณธ ๋ฌธ์ œ https://school.programmers.co.kr/learn/courses/30/lessons/157339


โ–  ๋ฌธ์ œ

๋ฌธ์ œ ์„ค๋ช…

 ๋‹ค์Œ์€ ์–ด๋Š ์ž๋™์ฐจ ๋Œ€์—ฌ ํšŒ์‚ฌ์—์„œ ๋Œ€์—ฌ ์ค‘์ธ ์ž๋™์ฐจ๋“ค์˜ ์ •๋ณด๋ฅผ ๋‹ด์€ CAR_RENTAL_COMPANY_CAR ํ…Œ์ด๋ธ”๊ณผ ์ž๋™์ฐจ ๋Œ€์—ฌ ๊ธฐ๋ก ์ •๋ณด๋ฅผ ๋‹ด์€ CAR_RENTAL_COMPANY_RENTAL_HISTORY ํ…Œ์ด๋ธ”๊ณผ ์ž๋™์ฐจ ์ข…๋ฅ˜ ๋ณ„ ๋Œ€์—ฌ ๊ธฐ๊ฐ„ ์ข…๋ฅ˜ ๋ณ„ ํ• ์ธ ์ •์ฑ… ์ •๋ณด๋ฅผ ๋‹ด์€ CAR_RENTAL_COMPANY_DISCOUNT_PLAN ํ…Œ์ด๋ธ” ์ž…๋‹ˆ๋‹ค. 

 CAR_RENTAL_COMPANY_CAR ํ…Œ์ด๋ธ”์€ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ๋˜์–ด์žˆ์œผ๋ฉฐ, CAR_ID, CAR_TYPE, DAILY_FEE, OPTIONS ๋Š” ๊ฐ๊ฐ ์ž๋™์ฐจ ID, ์ž๋™์ฐจ ์ข…๋ฅ˜, ์ผ์ผ ๋Œ€์—ฌ ์š”๊ธˆ(์›), ์ž๋™์ฐจ ์˜ต์…˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

Column name Type Nullable
CAR_ID INTEGER FALSE
CAR_TYPE VARCHAR(255) FALSE
DAILY_FEE INTEGER FALSE
OPTIONS VARCHAR(255) FALSE

 ์ž๋™์ฐจ ์ข…๋ฅ˜๋Š” '์„ธ๋‹จ', 'SUV', '์Šนํ•ฉ์ฐจ', 'ํŠธ๋Ÿญ', '๋ฆฌ๋ฌด์ง„' ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ž๋™์ฐจ ์˜ต์…˜ ๋ฆฌ์ŠคํŠธ๋Š” ์ฝค๋งˆ(',')๋กœ ๊ตฌ๋ถ„๋œ ํ‚ค์›Œ๋“œ ๋ฆฌ์ŠคํŠธ(์˜ˆ: ''์—ด์„ ์‹œํŠธ,์Šค๋งˆํŠธํ‚ค,์ฃผ์ฐจ๊ฐ์ง€์„ผ์„œ'')๋กœ ๋˜์–ด์žˆ์œผ๋ฉฐ, ํ‚ค์›Œ๋“œ ์ข…๋ฅ˜๋Š” '์ฃผ์ฐจ๊ฐ์ง€์„ผ์„œ', '์Šค๋งˆํŠธํ‚ค', '๋„ค๋น„๊ฒŒ์ด์…˜', 'ํ†ตํ’์‹œํŠธ', '์—ด์„ ์‹œํŠธ', 'ํ›„๋ฐฉ์นด๋ฉ”๋ผ', '๊ฐ€์ฃฝ์‹œํŠธ' ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 CAR_RENTAL_COMPANY_RENTAL_HISTORY ํ…Œ์ด๋ธ”์€ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ๋˜์–ด์žˆ์œผ๋ฉฐ, HISTORY_ID, CAR_ID, START_DATE, END_DATE ๋Š” ๊ฐ๊ฐ ์ž๋™์ฐจ ๋Œ€์—ฌ ๊ธฐ๋ก ID, ์ž๋™์ฐจ ID, ๋Œ€์—ฌ ์‹œ์ž‘์ผ, ๋Œ€์—ฌ ์ข…๋ฃŒ์ผ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

Column name Type Nullable
HISTORY_ID INTEGER FALSE
CAR_ID INTEGER FALSE
START_DATE DATE FALSE
END_DATE DATE FALSE

CAR_RENTAL_COMPANY_DISCOUNT_PLAN ํ…Œ์ด๋ธ”์€ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ๋˜์–ด์žˆ์œผ๋ฉฐ, PLAN_ID, CAR_TYPE, DUTAION_TYPE, DISCOUNT_RATE ๋Š” ๊ฐ๊ฐ ์š”๊ธˆ ํ• ์ธ ์ •์ฑ… ID, ์ž๋™์ฐจ ์ข…๋ฅ˜, ๋Œ€์—ฌ ๊ธฐ๊ฐ„ ์ข…๋ฅ˜, ํ• ์ธ์œจ(%)์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

Column name Type Nullable
PLAN_ID INTEGER FALSE
CAR_TYPE VARCHAR(255) FALSE
DURATION_TYPE VARCHAR(255) FALSE
DISCOUNT_RATE INTEGER FALSE

๋ฌธ์ œ 

CAR_RENTAL_COMPANY_CAR ํ…Œ์ด๋ธ”๊ณผ CAR_RENTAL_COMPANY_RENTAL_HISTORY ํ…Œ์ด๋ธ”๊ณผ CAR_RENTAL_COMPANY_DISCOUNT_PLAN ํ…Œ์ด๋ธ”์—์„œ ์ž๋™์ฐจ ์ข…๋ฅ˜๊ฐ€ '์„ธ๋‹จ' ๋˜๋Š” 'SUV' ์ธ ์ž๋™์ฐจ ์ค‘ 2022๋…„ 11์›” 1์ผ๋ถ€ํ„ฐ 2022๋…„ 11์›” 30์ผ๊นŒ์ง€ ๋Œ€์—ฌ ๊ฐ€๋Šฅํ•˜๊ณ  30์ผ๊ฐ„์˜ ๋Œ€์—ฌ ๊ธˆ์•ก์ด 50๋งŒ์› ์ด์ƒ 200๋งŒ์› ๋ฏธ๋งŒ์ธ ์ž๋™์ฐจ์— ๋Œ€ํ•ด์„œ ์ž๋™์ฐจ ID, ์ž๋™์ฐจ ์ข…๋ฅ˜, ๋Œ€์—ฌ ๊ธˆ์•ก(์ปฌ๋Ÿผ๋ช…: FEE) ๋ฆฌ์ŠคํŠธ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” SQL๋ฌธ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”. ๊ฒฐ๊ณผ๋Š” ๋Œ€์—ฌ ๊ธˆ์•ก์„ ๊ธฐ์ค€์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌํ•˜๊ณ , ๋Œ€์—ฌ ๊ธˆ์•ก์ด ๊ฐ™์€ ๊ฒฝ์šฐ ์ž๋™์ฐจ ์ข…๋ฅ˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ, ์ž๋™์ฐจ ์ข…๋ฅ˜๊นŒ์ง€ ๊ฐ™์€ ๊ฒฝ์šฐ ์ž๋™์ฐจ ID๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌํ•ด์ฃผ์„ธ์š”.


โ–  ํ’€์ด

  ๋ฌธ์ œ ์š”๊ตฌ์‚ฌํ•ญ  

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

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

30์ผ๊ฐ„์˜ ๋Œ€์—ฌ ๊ธˆ์•ก์ด 50๋งŒ์› ์ด์ƒ 200๋งŒ์› ๋ฏธ๋งŒ์ธ ์ž๋™์ฐจ ³์— ๋Œ€ํ•ด์„œ                       < ๋‚ด์šฉ์กฐ๊ฑด 1, 2, 3

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

๊ฒฐ๊ณผ๋Š” ๋Œ€์—ฌ ๊ธˆ์•ก์„ ๊ธฐ์ค€์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌํ•˜๊ณ ,                                                             < ์ •๋ ฌ์กฐ๊ฑด1

๋Œ€์—ฌ ๊ธˆ์•ก์ด ๊ฐ™์€ ๊ฒฝ์šฐ ์ž๋™์ฐจ ์ข…๋ฅ˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ,                                      < ์ •๋ ฌ์กฐ๊ฑด2

์ž๋™์ฐจ ์ข…๋ฅ˜๊นŒ์ง€ ๊ฐ™์€ ๊ฒฝ์šฐ ์ž๋™์ฐจ ID๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ                                   < ์ •๋ ฌ์กฐ๊ฑด3


๋‚ด์šฉ์กฐ๊ฑด2 ์— ํ•ด๋‹นํ•˜๋Š” CAR_ID๋ฅผ ๋ฝ‘์•„๋‚ด๋Š” ๊ฒƒ์ด ๊ด€๊ฑด์ธ ๋ฌธ์ œ์˜€๋‹ค.

์ฒ˜์Œ์—” START_DATE์™€ END_DATE๋ฅผ WHERE์ ˆ OR ์กฐ๊ฑด์œผ๋กœ ๋‘๊ณ  ์ถœ๋ ฅํ•ด๋ดค๋Š”๋ฐ ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•˜๋Š” CAR_ID๊ฐ€ ์ถœ๋ ฅ๋˜์ง€ ์•Š๋Š” ๊ฑธ ํ™•์ธํ–ˆ๋‹ค.

 

 ๊ทธ๋ž˜์„œ  ์„ธ๋‹จ์ด๊ฑฐ๋‚˜ SUV ์ธ ๋ฐ์ดํ„ฐ๊ฐ’¹์„ CAR_ID๋กœ ๊ทธ๋ฃนํ•‘ํ•ด์„œ ๊ฐ€์žฅ ์ตœ๊ทผ ์‹œ์ž‘๋‚ ์งœ๊ฐ€ ์ตœ์†Œ 12์›” 1์ผ์ด๊ฑฐ๋‚˜ ์ตœ๊ทผ ๋Œ€์—ฌ ์ข…๋ฃŒ ๋‚ ์งœ๊ฐ€ 10์›” 31์ผ์ธ CAR_ID๋ฅผ ํฌํ•จํ•˜๋Š”² ์ด๋ผ๋Š” ์กฐ๊ฑด์„ ๋ฉ”์ธ์ฟผ๋ฆฌ WHERE์ ˆ ์กฐ๊ฑด 1

ํ• ์ธ์œจ(CAR_TYPE๋ณ„ ๋Œ€์—ฌ๊ธฐ๊ฐ„ 30์ผ ์ด์ƒ ์กฐ๊ฑด)์„ ๋ฉ”์ธ์ฟผ๋ฆฌ WHERE์ ˆ ์กฐ๊ฑด 2 ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค.

 

SELECT์ ˆ์—์„œ ์ถœ๋ ฅ๋˜๋Š” CAR_ID๋ณ„ FEE๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ๋‚œ ํ›„์— HAVING์ ˆ์—์„œ ์กฐ๊ฑด  ³ 

์ ์šฉํ•˜๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ ์ •๋ ฌ์กฐ๊ฑด 1~3์„ ์ ์šฉํ•ด์ฃผ์—ˆ๋‹ค.

SELECT DISTINCT CRCC.CAR_ID AS CAR_ID
    , CRCC.CAR_TYPE AS CAR_TYPE
    , FLOOR(CRCC.DAILY_FEE * 30 * (0.01*(100- CRCDP.DISCOUNT_RATE))) AS FEE
 FROM CAR_RENTAL_COMPANY_CAR CRCC
 
 LEFT JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY CRCRH
 ON CRCC.CAR_ID = CRCRH.CAR_ID
 
 LEFT JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN CRCDP
 ON CRCC.CAR_TYPE = CRCDP.CAR_TYPE
 
 WHERE CRCC.CAR_ID IN (SELECT CH.CAR_ID
                  FROM CAR_RENTAL_COMPANY_CAR CC
                  LEFT JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY CH
                  ON CH.CAR_ID = CC.CAR_ID
                  WHERE CC.CAR_TYPE IN ('์„ธ๋‹จ','SUV')
                  GROUP BY 1
                  HAVING MAX(START_DATE) > '2022-11-30 23:59:59'
                  OR MAX(END_DATE) < '2022-11-01 00:00:00')
                  
AND CRCDP.DURATION_TYPE = '30์ผ ์ด์ƒ'
HAVING FEE >= 500000 AND FEE < 2000000
ORDER BY 3 DESC, 2, 1 DESC
;