๋ฌธ์ œ

๐Ÿ“Œ MySQL ์œผ๋กœ ํ’€์ด

 

๐Ÿ“Œ ๋ฌธ์ œ ๋งํฌ :

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

 

๐Ÿ“Œ ๋ฌธ์ œ ์„ค๋ช… :

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

 

๐Ÿ“Œ ํ…Œ์ด๋ธ”

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

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, ํŒ๋งค๋Ÿ‰, ํŒ๋งค์ผ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

ONLINE_SALE_ID INTEGER FALSE
USER_ID INTEGER FALSE
PRODUCT_ID INTEGER FALSE
SALES_AMOUNT INTEGER FALSE
SALES_DATE DATE FALSE

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


ํ’€์ด

์ถ”์ธก) 

๋ถ„๋ฅ˜ํ•˜๊ณ ์ž ํ•˜๋Š” 3๊ฐœ ์ปฌ๋Ÿผ๊ณผ ํšŒ์› ์•„์ด๋”” ๋งŒ์„ ์งˆ์˜ํ•˜๋Š” ์ฟผ๋ฆฌ ๋จผ์ €ํ•˜๊ณ  ์ด๋ฅผ ๋ถ„๋ฅ˜ ์ปฌ๋Ÿผ์œผ๋กœ Group byํ•ด์ค˜์„œ countํ•˜๋ฉด ๋ ๋“ฏํ•˜๋‹ค. 

 

์ฟผ๋ฆฌ) 

* 1์ฐจ) ์„ฑ๊ณต

SELECT A.YEAR, A.MONTH, A.GENDER, COUNT(A.USER_ID) AS USERS
FROM
    (SELECT 
        YEAR(SALES_DATE) AS YEAR, 
        MONTH(SALES_DATE) AS MONTH,
        GENDER,
        U.USER_ID
    FROM ONLINE_SALE AS O
    LEFT OUTER JOIN USER_INFO AS U
    ON O.USER_ID = U.USER_ID
    WHERE U.GENDER IS NOT NULL
    GROUP BY YEAR, MONTH, GENDER, U.USER_ID) AS A
GROUP BY A.YEAR, A.MONTH, A.GENDER
ORDER BY YEAR ASC, MONTH ASC, GENDER ASC

* 2์ฐจ) ์„ฑ๊ณต

SELECT A.YEAR, A.MONTH, A.GENDER, COUNT(A.USER_ID) AS USERS
FROM
    (SELECT DISTINCT
        YEAR(SALES_DATE) AS YEAR, 
        MONTH(SALES_DATE) AS MONTH,
        GENDER,
        U.USER_ID
    FROM ONLINE_SALE AS O
    LEFT OUTER JOIN USER_INFO AS U
    ON O.USER_ID = U.USER_ID
    WHERE U.GENDER IS NOT NULL) AS A
GROUP BY A.YEAR, A.MONTH, A.GENDER
ORDER BY YEAR ASC, MONTH ASC, GENDER ASC

 

๋ฆฌ๋ทฐ) 

+ ๊ฐ™์€ ๋‹ฌ์˜ ์ค‘๋ณต ๊ตฌ๋งค ํšŒ์›์„ ์ œ์™ธ ํ•  ํ•„์š”๋„ ์žˆ์—ˆ๋‹ค

 

๊ทธ๋ฆฌ๊ณ  ์ข€๋” ํšจ์œจ์ ์œผ๋กœ ๋ฐ”๊พธ๊ณ  ์‹ถ์–ด!

1์ฐจ์—์„œ์˜ Group by๋ฅผ ์ œ์™ธํ•˜๊ณ  Distinct๋กœ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ฐ™์€ ๋‹ฌ์— ์—ฌ๋Ÿฌ๋ฒˆ ๊ตฌ๋งคํ•œ ํšŒ์›์ˆ˜๋ฅผ ์ œ์™ธํ–ˆ๋‹ค.

์ด๋Ÿฌ๋‹ˆ๊นŒ ์—ฌ๋Ÿฌ๋ชจ๋กœ ๊ณต์ˆ˜๊ฐ€ ๋งŽ์ด ๋“œ๋Š” Group by๋ฅผ ํ•˜๋‚˜ ์ œ์™ธํ•  ์ˆ˜ ์žˆ์—ˆ์Œ!

+ Recent posts