문제

πŸ“Œ MySQL 둜 풀이

 

πŸ“Œ λ¬Έμ œ 링크 :

 

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

μ½”λ“œ μ€‘μ‹¬μ˜ 개발자 μ±„μš©. μŠ€νƒ 기반의 ν¬μ§€μ…˜ 맀칭. ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€μ˜ 개발자 λ§žμΆ€ν˜• ν”„λ‘œν•„μ„ λ“±λ‘ν•˜κ³ , λ‚˜μ™€ 기술 ꢁ합이 잘 λ§žλŠ” 기업듀을 맀칭 λ°›μœΌμ„Έμš”.

programmers.co.kr

 

πŸ“Œ λ¬Έμ œ μ„€λͺ… :

USER_INFO ν…Œμ΄λΈ”κ³Ό ONLINE_SALE ν…Œμ΄λΈ”μ—μ„œ 2021년에 κ°€μž…ν•œ 전체 νšŒμ›λ“€ 쀑 μƒν’ˆμ„ κ΅¬λ§€ν•œ νšŒμ›μˆ˜μ™€ μƒν’ˆμ„ κ΅¬λ§€ν•œ νšŒμ›μ˜ λΉ„μœ¨(=2021년에 κ°€μž…ν•œ νšŒμ› 쀑 μƒν’ˆμ„ κ΅¬λ§€ν•œ νšŒμ›μˆ˜ / 2021년에 κ°€μž…ν•œ 전체 νšŒμ› 수)을 λ…„, μ›” λ³„λ‘œ 좜λ ₯ν•˜λŠ” 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 쑰합에 λŒ€ν•΄μ„œλŠ” ν•˜λ‚˜μ˜ 판맀 λ°μ΄ν„°λ§Œ μ‘΄μž¬ν•©λ‹ˆλ‹€.

 


풀이

μΆ”μΈ‘) 

2021년에 κ°€μž…ν•œ μ‚¬λžŒμˆ˜λ₯Ό λ³€μˆ˜λ‘œ λ¨Όμ € λŒ€μž….

그리고 2021년에 κ°€μž…ν•œ μ‚¬λžŒλ“€ 리슀트λ₯Ό λŒ€μƒμœΌλ‘œ 온라인 주문을 joinν•΄μ„œ μΌμΉ˜ν•˜λŠ” 것을 쑰회.

λ…„, μ›” κΈ°μ€€μœΌλ‘œ κ·Έλ£Ήν™”ν•œ λ‹€μŒμ— 같은 달에 λ˜‘κ°™μ€ μ‚¬λžŒμ΄ μ£Όλ¬Έν–ˆμ„ 경우λ₯Ό μƒκ°ν•΄μ„œ μ€‘λ³΅μ œκ±°λ‘œ DISTINCT μ μš©ν•˜κ³ 

count둜 μ£Όλ¬ΈνšŒμ›μˆ˜, 2021κ°€μž…μž 수 λ³€μˆ˜μ—μ„œ count λΉ„μœ¨μ„ ꡬ해 좜λ ₯ν•˜λ©΄ 될 λ“―!

 

쿼리) 

* 1μ°¨) μ‹€νŒ¨

SET @CNT = (SELECT COUNT(*) FROM USER_INFO WHERE YEAR(JOINED) = '2021');

SELECT DISTINCT
    YEAR(O.SALES_DATE) AS YEAR,
    MONTH(O.SALES_DATE) AS MONTH,
    COUNT(*) AS PUCHASED_USERS,
    ROUND(COUNT(*) / @CNT, 1) AS PUCHASED_RATIO
FROM ONLINE_SALE AS O
INNER JOIN (SELECT *
            FROM USER_INFO
            WHERE YEAR(JOINED) = '2021') AS U
ON O.USER_ID = U.USER_ID
GROUP BY YEAR, MONTH
ORDER BY YEAR ASC, MONTH ASC

* 2μ°¨) 성곡

SET @CNT = (SELECT COUNT(*) FROM USER_INFO WHERE YEAR(JOINED) = '2021');

SELECT 
    YEAR, 
    MONTH, 
    COUNT(*) AS PUCHASED_USERS,
    ROUND(COUNT(*)/@CNT, 1) AS PUCHASED_RATIO
FROM (SELECT DISTINCT
        YEAR(SALES_DATE) AS YEAR,
        MONTH(SALES_DATE) AS MONTH,
        USER_ID
      FROM ONLINE_SALE) AS O                   # λ…„,λ‹¬λ§ˆλ‹€ κ΅¬λ§€ν•œ νšŒμ› 리슀트  
INNER JOIN (SELECT USER_ID
            FROM USER_INFO
            WHERE YEAR(JOINED) = '2021') AS U  # 2021년에 κ°€μž…ν•œ νšŒμ› 리슀트
ON O.USER_ID = U.USER_ID
GROUP BY YEAR, MONTH
ORDER BY YEAR ASC, MONTH ASC

 

리뷰) 

1μ°¨μ—μ„œ μ€‘λ³΅μ œκ±°λž‘ κ·Έλ£Ήν™”λ₯Ό κ°™μ΄ν•˜λ©΄μ„œ μ˜λ„μΉ˜ μ•Šμ€ κ²°κ³Όκ°€ λ‚˜μ™”λ‹€. 

DISTINCTκ°€ μ‹€ν–‰λ˜λŠ” 기쀀을 생각해보면

1μ°¨μ—μ„œλŠ” 쀑볡이 μ œκ±°λ˜μ§€ μ•Šμ€ μƒνƒœλ‘œ λ¨Όμ € countκ³Ό λΉ„μœ¨μ΄ λ‹€ κ³„μ‚°λ˜κ³ λ‚œ 이후에 쀑볡을 μ œκ±°ν•˜λŠ” 거라,

같은 달에 또 κ΅¬λ§€ν•œ ꡬ맀자λ₯Ό κ±°λ₯΄μ§€ λͺ»ν–ˆλ‹€.

 

이 쀑볡을 λ¨Όμ € μ œκ±°ν•˜κΈ° μœ„ν•΄ 

2μ°¨μ—μ„œλŠ” λ…„κ³Ό 달 κΈ°μ€€μœΌλ‘œ κ΅¬λ§€ν•œ νšŒμ›μ„ 쀑볡없이 λ¦¬μŠ€νŠΈν™” μ‹œν‚¬ 수 있게 μ§ˆμ˜ν•΄μ„œ λ¨Όμ € μ •λ¦¬ν•˜κ³  

이λ₯Ό κΈ°μ€€μœΌλ‘œ countν•΄μ„œ μ •ν™•ν•œ κ²°κ³Όκ°€ λ‚˜μ˜€κ²Œ ν–ˆλ‹€!

+ Recent posts