πŸ–₯️ μ½”λ”©ν…ŒμŠ€νŠΈ/SQL

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] [SQL] μƒν’ˆμ„ κ΅¬λ§€ν•œ νšŒμ› λΉ„μœ¨ κ΅¬ν•˜κΈ°

rtw0202 2026. 2. 17. 10:49

1. 문제 μ„€λͺ…

λ‹€μŒμ€ μ–΄λŠ 의λ₯˜ μ‡Όν•‘λͺ°μ— κ°€μž…ν•œ νšŒμ› 정보λ₯Ό 담은 USER_INFO ν…Œμ΄λΈ”κ³Ό 온라인 μƒν’ˆ 판맀 정보λ₯Ό 담은 ONLINE_SALE ν…Œμ΄λΈ” μž…λ‹ˆλ‹€. USER_INFO ν…Œμ΄λΈ”은 μ•„λž˜μ™€ 같은 ꡬ쑰둜 λ˜μ–΄μžˆμœΌλ©° USER_IDGENDERAGEJOINEDλŠ” 각각 νšŒμ› ID, 성별, λ‚˜μ΄, κ°€μž…μΌμ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

GENDER μ»¬λŸΌμ€ λΉ„μ–΄μžˆκ±°λ‚˜ 0 λ˜λŠ” 1의 값을 κ°€μ§€λ©° 0인 경우 λ‚¨μžλ₯Ό, 1인 κ²½μš°λŠ” μ—¬μžλ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€. ONLINE_SALE ν…Œμ΄λΈ”은 μ•„λž˜μ™€ 같은 ꡬ쑰둜 λ˜μ–΄μžˆμœΌλ©° ONLINE_SALE_ID, USER_ID, PRODUCT_ID, SALES_AMOUNT, SALES_DATEλŠ” 각각 온라인 μƒν’ˆ 판맀 ID, νšŒμ› ID, μƒν’ˆ ID, νŒλ§€λŸ‰, νŒλ§€μΌμ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

λ™μΌν•œ λ‚ μ§œ, νšŒμ› ID, μƒν’ˆ ID 쑰합에 λŒ€ν•΄μ„œλŠ” ν•˜λ‚˜μ˜ 판맀 λ°μ΄ν„°λ§Œ μ‘΄μž¬ν•©λ‹ˆλ‹€.

USER_INFO ν…Œμ΄λΈ”κ³Ό ONLINE_SALE ν…Œμ΄λΈ”μ—μ„œ 2021년에 κ°€μž…ν•œ 전체 νšŒμ›λ“€ 쀑 μƒν’ˆμ„ κ΅¬λ§€ν•œ νšŒμ›μˆ˜μ™€ μƒν’ˆμ„ κ΅¬λ§€ν•œ νšŒμ›μ˜ λΉ„μœ¨(=2021년에 κ°€μž…ν•œ νšŒμ› 쀑 μƒν’ˆμ„ κ΅¬λ§€ν•œ νšŒμ›μˆ˜ / 2021년에 κ°€μž…ν•œ 전체 νšŒμ› 수)을 λ…„, μ›” λ³„λ‘œ 좜λ ₯ν•˜λŠ” SQL문을 μž‘μ„±ν•΄μ£Όμ„Έμš”. μƒν’ˆμ„ κ΅¬λ§€ν•œ νšŒμ›μ˜ λΉ„μœ¨μ€ μ†Œμˆ˜μ  λ‘λ²ˆμ§Έμžλ¦¬μ—μ„œ λ°˜μ˜¬λ¦Όν•˜κ³ , 전체 κ²°κ³ΌλŠ” 년을 κΈ°μ€€μœΌλ‘œ μ˜€λ¦„μ°¨μˆœ μ •λ ¬ν•΄μ£Όμ‹œκ³  년이 κ°™λ‹€λ©΄ 월을 κΈ°μ€€μœΌλ‘œ μ˜€λ¦„μ°¨μˆœ μ •λ ¬ν•΄μ£Όμ„Έμš”. 


2. 좜λ ₯ μ˜ˆμ‹œ

 
3. 문제 λ‹΅μ•ˆ

# 2021년에 κ°€μž…ν•œ 전체 νšŒμ› 수
WITH total AS (
  SELECT COUNT(DISTINCT user_id) AS total_users
  FROM user_info
  WHERE joined >= '2021-01-01' AND 
        joined < '2022-01-01'
)

# pu'r'chased_ratio 문제 μ˜€νƒ€
SELECT 
    YEAR(o.sales_date) as year,
    MONTH(o.sales_date) as month,
    COUNT(DISTINCT o.user_id) as purchased_users,
    ROUND((COUNT(DISTINCT o.user_id) / total.total_users), 1) as puchased_ratio
FROM user_info u
JOIN online_sale o
ON u.user_id = o.user_id
CROSS JOIN total
WHERE u.joined >= '2021-01-01' AND
      u.joined < '2022-01-01'
GROUP BY YEAR(o.sales_date), MONTH(o.sales_date)
ORDER BY year ASC, month ASC;