Growth ๐ŸŒณ/Practice ๐Ÿ’ป

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ์ƒํ’ˆ์„ ๊ตฌ๋งคํ•œ ํšŒ์› ๋น„์œจ ๊ตฌํ•˜๊ธฐ (23.06.13 ํ’€์ด ์ถ”๊ฐ€)

์ธ” 2023. 1. 10. 02:58

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

       ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต,   
       https://school.programmers.co.kr/learn/challenges?page=1&languages=mysql%2Coracle
์ž„์„ ๋ฐํž™๋‹ˆ๋‹ค.


โ–  ๋ฌธ์ œ

๋ฌธ์ œ ์„ค๋ช…

๋‹ค์Œ์€ ์–ด๋Š ์˜๋ฅ˜ ์‡ผํ•‘๋ชฐ์— ๊ฐ€์ž…ํ•œ ํšŒ์› ์ •๋ณด๋ฅผ ๋‹ด์€ USER_INFO ํ…Œ์ด๋ธ”๊ณผ ์˜จ๋ผ์ธ ์ƒํ’ˆ ํŒ๋งค ์ •๋ณด๋ฅผ ๋‹ด์€ ONLINE_ SALE ํ…Œ์ด๋ธ” ์ž…๋‹ˆ๋‹ค.

USER_INFO ํ…Œ์ด๋ธ”์€ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ๋˜์–ด์žˆ๋ฉฐ USER_ID, GENDER, AGE, JOINED๋Š” ๊ฐ๊ฐ ํšŒ์› ID, ์„ฑ๋ณ„, ๋‚˜์ด, ๊ฐ€์ž…์ผ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

 

Column name Type Nullable
USER_ID INTEGER FALSE
GENDER TINYINT(1) TRUE
AGE INTEGER TRUE
JOINED DATE FALSE

GENDER ์ปฌ๋Ÿผ์€ ๋น„์–ด์žˆ๊ฑฐ๋‚˜ 0 ๋˜๋Š” 1์˜ ๊ฐ’์„ ๊ฐ€์ง€๋ฉฐ 0์ธ ๊ฒฝ์šฐ ๋‚จ์ž๋ฅผ, 1์ธ ๊ฒฝ์šฐ๋Š” ์—ฌ์ž๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

ONLINE_SALE ํ…Œ์ด๋ธ”์€ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ๋˜์–ด์žˆ์œผ๋ฉฐ ONLINE_SALE_ID, USER_ID, PRODUCT_ID, SALES_ AMOUNT, SALES_DATE๋Š” ๊ฐ๊ฐ ์˜จ๋ผ์ธ ์ƒํ’ˆ ํŒ๋งค ID, ํšŒ์› ID, ์ƒํ’ˆ ID, ํŒ๋งค๋Ÿ‰, ํŒ๋งค์ผ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

Column name Type Nullable
ONLINE_SALE_ID INTEGER FALSE
USER_ID INTEGER FALSE
PRODUCT_ID INTEGER FALSE
SALES_AMOUNT INTEGER FALSE
SALES_DATE DATE FALSE

๋™์ผํ•œ ๋‚ ์งœ, ํšŒ์› ID, ์ƒํ’ˆ ID ์กฐํ•ฉ์— ๋Œ€ํ•ด์„œ๋Š” ํ•˜๋‚˜์˜ ํŒ๋งค ๋ฐ์ดํ„ฐ๋งŒ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.


๋ฌธ์ œ 

USER_INFO ํ…Œ์ด๋ธ”๊ณผ ONLINE_SALE ํ…Œ์ด๋ธ”์—์„œ 2021๋…„์— ๊ฐ€์ž…ํ•œ ์ „์ฒด ํšŒ์›๋“ค ์ค‘ ์ƒํ’ˆ์„ ๊ตฌ๋งคํ•œ ํšŒ์›์ˆ˜์™€ ์ƒํ’ˆ์„ ๊ตฌ๋งคํ•œ ํšŒ์›์˜ ๋น„์œจ(=2021๋…„์— ๊ฐ€์ž…ํ•œ ํšŒ์› ์ค‘ ์ƒํ’ˆ์„ ๊ตฌ๋งคํ•œ ํšŒ์›์ˆ˜ / 2021๋…„์— ๊ฐ€์ž…ํ•œ ์ „์ฒด ํšŒ์› ์ˆ˜)์„ ๋…„, ์›” ๋ณ„๋กœ ์ถœ๋ ฅํ•˜๋Š” SQL๋ฌธ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”. ์ƒํ’ˆ์„ ๊ตฌ๋งคํ•œ ํšŒ์›์˜ ๋น„์œจ์€ ์†Œ์ˆ˜์  ๋‘๋ฒˆ์งธ์ž๋ฆฌ์—์„œ ๋ฐ˜์˜ฌ๋ฆผํ•˜๊ณ , ์ „์ฒด ๊ฒฐ๊ณผ๋Š” ๋…„์„ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•ด์ฃผ์‹œ๊ณ  ๋…„์ด ๊ฐ™๋‹ค๋ฉด ์›”์„ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•ด์ฃผ์„ธ์š”.


 

โ–  ํ’€์ด

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

USER_INFO ํ…Œ์ด๋ธ”๊ณผ ONLINE_SALE ํ…Œ์ด๋ธ”์—์„œ

2021๋…„์— ๊ฐ€์ž…ํ•œ ์ „์ฒด ํšŒ์›๋“ค ์ค‘ ์ƒํ’ˆ์„ ๊ตฌ๋งคํ•œ ํšŒ์›์ˆ˜์™€ ์ƒํ’ˆ์„ ๊ตฌ๋งคํ•œ ํšŒ์›์˜ ๋น„์œจ

(=2021๋…„์— ๊ฐ€์ž…ํ•œ ํšŒ์› ์ค‘ ์ƒํ’ˆ์„ ๊ตฌ๋งคํ•œ ํšŒ์›์ˆ˜ / 2021๋…„์— ๊ฐ€์ž…ํ•œ ์ „์ฒด ํšŒ์› ์ˆ˜)์„ ๋…„, ์›” ๋ณ„๋กœ ์ถœ๋ ฅ

 

> ๋น„์œจ์˜ ๋ถ„๋ชจ, ๋ถ„์ž ๋ฐ์ดํ„ฐ ์ˆ˜๋Ÿ‰์— ๋ชจ๋‘ '2021๋…„์— ๊ฐ€์ž…ํ•œ' ํšŒ์›์ด๋ผ๋Š” ์กฐ๊ฑด์ด ๋ถ€์—ฌ๋˜์—ˆ๋‹ค.

   ์ด ์กฐ๊ฑด์„ ์ฟผ๋ฆฌ๋กœ ์ž˜ ํ’€์–ด๋‚ด๋Š” ๊ฒƒ์ด ์ค‘์š”ํ–ˆ๋‹ค.

         <๋ถ„๋ชจ> ๋Š” (2021๋…„ ๊ฐ€์ž…์ž์ด๋ฉด์„œ) ONLINE_SALE ํ…Œ์ด๋ธ”์—์„œ 2021๋…„ ๊ตฌ๋งค ํšŒ์›์˜ ์ˆ˜๋ฅผ ์ถ”์ถœํ•ด์•ผํ•˜๊ณ 

          <๋ถ„์ž> ๋Š” USER_INFO ํ…Œ์ด๋ธ”์—์„œ 2021๋…„ ๊ฐ€์ž… ํšŒ์›์˜ ์ˆ˜๋ฅผ ์ถ”์ถœ.

 

> ์ฟผ๋ฆฌ ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ์ƒ๊ฐํ–ˆ์„ ๋•Œ,  ONLINE_SALE ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ์—์„œ  USER_INFO์—์„œ 2021๋…„ ๊ฐ€์ž… ํšŒ์›๋งŒ์„ ๋Œ€์ƒ์œผ๋กœ ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด USER_INFO ํ…Œ์ด๋ธ”์— JOINED ๋‚ ์งœ ๊ธฐ๊ฐ„ ์กฐ๊ฑด +  INNER JOIN ์ ์šฉ 

 

> WHERE์ ˆ์— ๊ฐ€์ž…์‹œ๊ธฐ ์กฐ๊ฑด์€ ์ด์ „์— ํ’€์—ˆ๋˜ ๋ฌธ์ œ์ฒ˜๋Ÿผ DATE_FORMAT() ์•„๋‹Œ BETWEEN ~ AND ๋ฌธ๋ฒ• ์‚ฌ์šฉ

 

> ๋ถ„๋ชจ์— USER_INFO ํ…Œ์ด๋ธ”์„ ๋Œ€์ƒ์œผ๋กœ 2021๋…„ ๊ฐ€์ž…์ž ์ˆ˜๋งŒ ๋ฝ‘์•„์ฃผ๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒƒ์ด ํ’€์ด์— ์ œ์ผ ์‹œ์ž‘์ ์ด ๋˜์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค. 

 

์ƒํ’ˆ์„ ๊ตฌ๋งคํ•œ ํšŒ์›์˜ ๋น„์œจ์€ ์†Œ์ˆ˜์  ๋‘๋ฒˆ์งธ์ž๋ฆฌ์—์„œ ๋ฐ˜์˜ฌ๋ฆผ   > SELECT์ ˆ์—์„œ ROUND() ํ•จ์ˆ˜ ์‚ฌ์šฉ

์ „์ฒด ๊ฒฐ๊ณผ๋Š” ๋…„์„ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ                                     > ์ •๋ ฌ์กฐ๊ฑด 1

๋…„์ด ๊ฐ™๋‹ค๋ฉด ์›”์„ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ                                     > ์ •๋ ฌ์กฐ๊ฑด 2

 

SELECT DATE_FORMAT(OS.SALES_DATE, '%Y') YEAR, 
DATE_FORMAT(OS.SALES_DATE, '%m') MONTH,
COUNT(DISTINCT OS.USER_ID) PUCHASED_USERS
,ROUND(COUNT(DISTINCT OS.USER_ID) / (SELECT COUNT(DISTINCT USER_ID) 
                                     FROM USER_INFO
                                     WHERE JOINED BETWEEN '2021-01-01 00:00:00'
                                     AND '2021-12-31 23:59:59'), 1) PUCHASED_RATIO
 FROM ONLINE_SALE OS
 INNER JOIN (SELECT USER_ID, JOINED 
            FROM USER_INFO
            WHERE JOINED BETWEEN '2021-01-01 00:00:00' AND '2021-12-31 23:59:59') UI
 ON OS.USER_ID = UI.USER_ID
 GROUP BY 1, 2
 ORDER BY 1, 2

 

โœ” ์ถ”๊ฐ€ : ๋‚ ์งœํ•จ์ˆ˜ ํ™œ์šฉํ•ด์„œ ์ฝ”๋“œ ๊ฐ„๋‹จํžˆ ํ•˜๊ธฐ (2023.06.13 ํ’€์ด)

SELECT YEAR(OS.SALES_DATE) AS YEAR
      ,MONTH(OS.SALES_DATE) AS MONTH
      ,COUNT(DISTINCT OS.USER_ID) AS PUCHASED_USERS
      ,ROUND((COUNT(DISTINCT OS.USER_ID) / (SELECT COUNT(DISTINCT USER_ID)
                                            FROM USER_INFO
                                            WHERE YEAR(JOINED) = '2021')), 1) AS PUCHASED_RATIO
 FROM ONLINE_SALE OS
 JOIN USER_INFO UI
 ON OS.USER_ID = UI.USER_ID AND YEAR(UI.JOINED) = '2021'
 GROUP BY 1, 2
 ORDER BY 1, 2;

์ถ”๊ฐ€ ํ’€์ด์—์„œ๋Š” ์กฐ์ธํ•  ํ…Œ์ด๋ธ”์— user_info์—์„œ ๊ฐ€์ ธ์˜ฌ ๋•Œ ๊ฐ€์ž…๋…„๋„ = 2021 ์กฐ๊ฑด์„ ๊ฑธ์–ด์ฃผ๋Š” ๋Œ€์‹ 

์กฐ์ธ ๊ณผ์ •์—์„œ ๊ฐ€์ž…๋…„๋„๊ฐ€ 2021๋…„์ธ user์˜ user_id๋งŒ ์กฐ์ธ๋˜๋„๋ก ํ•ด๋ดค๋‹ค.