SQL

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

1eehyunji 2023. 8. 12. 23:13

๋ฌธ์ œ ์„ค๋ช…

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

Column nameTypeNullable

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 nameTypeNullable

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

๋ฌธ์ œ ํ’€์ด

SELECT YEAR, MONTH, COUNT(*), 
ROUND(COUNT(*)/(SELECT COUNT(*) FROM USER_INFO WHERE YEAR(JOINED)=2021),1) AS RATIO 
FROM (SELECT DISTINCT YEAR(SALES_DATE) 
      AS YEAR, MONTH(SALES_DATE) AS MONTH, S.USER_ID
    FROM ONLINE_SALE AS S
    JOIN USER_INFO AS U
    ON S.USER_ID=U.USER_ID
    AND YEAR(JOINED)=2021) SALE_USER
GROUP BY YEAR, MONTH
ORDER BY YEAR, MONTH;
  • 2021๋…„์— ๊ฐ€์ž…ํ•œ ํšŒ์›๋“ค์˜ ๊ตฌ๋งค ์ด๋ ฅ์„ ์กฐํšŒํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ธŒ์ฟผ๋ฆฌ๋กœ ์‚ฌ์šฉํ–ˆ๋‹ค.
  • ์ „์ฒด ํšŒ์›๋“ค์˜ ๊ตฌ๋งค ์ด๋ ฅ์ด ์ €์žฅ๋œ ONLINE_SALE ํ…Œ์ด๋ธ”๊ณผ ํšŒ์› ์ •๋ณด๊ฐ€ ์ €์žฅ๋œ USER_INFO ํ…Œ์ด๋ธ”์„ USER_ID๋ฅผ ๊ธฐ์ค€์œผ๋กœ JOINํ•˜๊ณ , YEAR(JOINED)=2021์ธ ํšŒ์›๋“ค ์ฆ‰, 2021๋…„์— ๊ฐ€์ž…ํ•œ ํšŒ์›๋“ค์˜ ๊ตฌ๋งค ๋…„, ๊ตฌ๋งค ์›”, ํšŒ์› ์•„์ด๋”” ์ปฌ๋Ÿผ์„ ์ถ”์ถœํ•œ๋‹ค. 
  • ์—ฌ๊ธฐ์„œ ์ฃผ์˜ํ•  ์ ์€ ๊ฐ™์€ ๋…„, ๊ฐ™์€ ์›”์— ๊ตฌ๋งค๋ฅผ ๋‘ ๋ฒˆ ํ•œ ํšŒ์›์ด ์žˆ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— DISTINCT๋ฅผ ์ด์šฉํ•ด์„œ ์ค‘๋ณต ์ œ๊ฑฐ๋ฅผ ํ•ด์ค€๋‹ค.
  • ์ด๋ ‡๊ฒŒ ์ถ”์ถœํ•œ ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”์€ SALE_USER ๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋ณ„์นญ์„ ๋ถ™์—ฌ์ค€๋‹ค.
  • SALE_USER ํ…Œ์ด๋ธ”์„ ๊ตฌ๋งค ๋…„๊ณผ ๊ตฌ๋งค ์›”์„ ๊ธฐ์ค€์œผ๋กœ ๊ทธ๋ฃนํ™”ํ•ด์ค€๋‹ค.
  • SALE_USER ํ…Œ์ด๋ธ”์—์„œ ๊ฐ ๊ทธ๋ฃน๋ณ„๋กœ ๋…„(YEAR), ์›”(MONTH)์„ ์ถ”์ถœํ•˜๊ณ  ๊ฐ ๊ทธ๋ฃน์˜ ๊ฐœ์ˆ˜(COUNT(*), ๋…„์›”๋ณ„ ์ƒํ’ˆ์„ ๊ตฌ๋งคํ•œ ํšŒ์› ์ˆ˜)์™€ ๋…„์›”๋ณ„ ์ƒํ’ˆ์„ ๊ตฌ๋งคํ•œ ํšŒ์›์˜ ๋น„์œจ(COUNT(*) / (์„œ๋ธŒ์ฟผ๋ฆฌ : USER_INFO ํ…Œ์ด๋ธ”์—์„œ ๊ฐ€์ž… ๋‚ ์งœ๊ฐ€ 2021๋…„์ธ ํšŒ์›์˜ ์ˆ˜))์„ ์ถ”์ถœํ•œ๋‹ค.
  • ๊ตฌ๋งค ํšŒ์› ๋น„์œจ์€ ์†Œ์ˆ˜ ๋‘๋ฒˆ์งธ ์ž๋ฆฌ์—์„œ ๋ฐ˜์˜ฌ๋ฆผํ•ด์•ผ ํ•˜๋ฏ€๋กœ ROUND(~, 1) ํ˜•ํƒœ๋กœ ์ถœ๋ ฅํ•œ๋‹ค.
  • ๋งˆ์ง€๋ง‰์œผ๋กœ ๊ตฌ๋งค ๋…„์„ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ, ๊ตฌ๋งค ์›”์„ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•˜์—ฌ ์ถœ๋ ฅํ•œ๋‹ค.

 

 

level 5์— ๊ฑธ๋งž๊ฒŒ ๊ฝค ๋ณต์žกํ•˜๊ณ  ์–ด๋ ค์šด ๋ฌธ์ œ์˜€๋‹ค..! ์ด ๋ฌธ์ œ๋ฅผ ๋์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค SQL ๊ณ ๋“์  ํ‚คํŠธ๋ฅผ ๋ชจ๋‘ ํ’€์—ˆ๋‹คใ…Žใ…Ž