Growth ๐ŸŒณ/Practice ๐Ÿ’ป

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ๋…„, ์›”, ์„ฑ๋ณ„ ๋ณ„ ์ƒํ’ˆ ๊ตฌ๋งค ํšŒ์› ์ˆ˜ ๊ตฌํ•˜๊ธฐ

์ธ” 2023. 1. 5. 02:49

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

       ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต,   
       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 ํ…Œ์ด๋ธ”์—์„œ ๋…„, ์›”, ์„ฑ๋ณ„ ๋ณ„๋กœ ์ƒํ’ˆ์„ ๊ตฌ๋งคํ•œ ํšŒ์›์ˆ˜๋ฅผ ์ง‘๊ณ„ํ•˜๋Š” SQL๋ฌธ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”. ๊ฒฐ๊ณผ๋Š” ๋…„, ์›”, ์„ฑ๋ณ„์„ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•ด์ฃผ์„ธ์š”. ์ด๋•Œ, ์„ฑ๋ณ„ ์ •๋ณด๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ๊ฒฐ๊ณผ์—์„œ ์ œ์™ธํ•ด์ฃผ์„ธ์š”.


โ–  ํ’€์ด

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

USER_INFO ํ…Œ์ด๋ธ”๊ณผ ONLINE_SALE ํ…Œ์ด๋ธ”์—์„œ ๋…„, ์›”, ์„ฑ๋ณ„ ๋ณ„๋กœ ์ƒํ’ˆ์„ ๊ตฌ๋งคํ•œ ํšŒ์›์ˆ˜๋ฅผ ์ง‘๊ณ„*

> USER_INFO ํ…Œ์ด๋ธ”๊ณผ ONLINE_SALE ํ…Œ์ด๋ธ” ๊ณตํ†ต์ปฌ๋Ÿผ USER_ID๋กœ ์กฐ์ธ 

> (๋…„, ์›”, ์„ฑ๋ณ„ ๋ณ„๋กœ) ๊ทธ๋ฃน์กฐ๊ฑด1, 2, 3

 

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

์ด๋•Œ, ์„ฑ๋ณ„ ์ •๋ณด๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ๊ฒฐ๊ณผ์—์„œ ์ œ์™ธ                                                              > WHERE์กฐ๊ฑด

 

* ์œ ์˜ํ•ด์•ผ ํ•  ์ 

๊ตฌ๋งค ๊ฑด์ˆ˜๋ฅผ ์ง‘๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ํšŒ์›์ˆ˜ ์ด๋ฏ€๋กœ

๋ฌธ์ œ ์กฐ๊ฑด์— [๋™์ผํ•œ ๋‚ ์งœ, ํšŒ์› ID, ์ƒํ’ˆ ID ์กฐํ•ฉ์— ๋Œ€ํ•ด์„œ๋Š” ํ•˜๋‚˜์˜ ํŒ๋งค ๋ฐ์ดํ„ฐ๋งŒ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.] ๋ผ๋Š” ์กฐ๊ฑด์—๋„ ํŠน์ • ๋‚ ์งœ ๋‚ด ํšŒ์› 1๋ช…์ด ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ƒํ’ˆ์„ ๊ตฌ๋งคํ–ˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ USER_ID ์ง‘๊ณ„์— ์ค‘๋ณต ์ œ๊ฑฐ(DISTINCT)๋ฅผ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

SELECT DATE_FORMAT(SALES_DATE, '%Y') AS YEAR,
       DATE_FORMAT(SALES_DATE, '%m') AS MONTH,
       UI.GENDER,
       COUNT(DISTINCT OS.USER_ID) USERS
 FROM ONLINE_SALE OS
 LEFT JOIN USER_INFO UI
 ON OS.USER_ID = UI.USER_ID
 WHERE UI.GENDER IS NOT NULL
 GROUP BY 1, 2, 3
 ORDER BY 1, 2, 3

 

โœ” ๋‚ ์งœ ํ•จ์ˆ˜(YEAR, MONTH) ํ™œ์šฉํ•œ ํ’€์ด (2023.06.13 ์ถ”๊ฐ€)

SELECT YEAR(SALES_DATE) AS YEAR
      ,MONTH(SALES_DATE) AS MONTH
      ,GENDER 
      ,COUNT(DISTINCT OS.USER_ID) AS USERS
 FROM ONLINE_SALE OS
 LEFT JOIN USER_INFO UI
 ON OS.USER_ID = UI.USER_ID
 WHERE UI.GENDER IS NOT NULL

 GROUP BY 1, 2, 3
 ORDER BY 1, 2, 3;