signup_month ASC반 인원 중에 몇 명이 학원에 등록했나 — 를 가입한 달마다 따로 센다. 등록 안 한 애도 반 인원에는 들어가야 한다.
| 가입 월 | 가입자 (분모) | 30일 안에 결제 (분자) | 전환율 |
|---|---|---|---|
| 1월 | 100명 | 23명 | 23.00 |
| 2월 | 120명 | 31명 | 25.83 |
결제를 아예 안 한 사람도 가입자 100명에는 포함된다. 이게 핵심.
100 이 아니라 100.0. 정수끼리 나누면 소수점이 날아가서 0 이 나오는 환경이 있다.묻는 것 · ‘전체’가 분모인 비율을 구할 줄 아는가. 그리고 조건부 집계.
WITH first_pay AS (
SELECT user_id, MIN(paid_date) AS fp FROM payments GROUP BY user_id
)
SELECT DATE_FORMAT(u.signup_date, '%Y-%m') AS signup_month,
COUNT(*) AS signups,
SUM(CASE WHEN f.fp <= DATE_ADD(u.signup_date, INTERVAL 30 DAY)
THEN 1 ELSE 0 END) AS converted,
ROUND(100.0 * SUM(CASE WHEN f.fp <= DATE_ADD(u.signup_date, INTERVAL 30 DAY)
THEN 1 ELSE 0 END) / COUNT(*), 2) AS conversion_rate
FROM users u
LEFT JOIN first_pay f ON f.user_id = u.user_id
GROUP BY signup_month
ORDER BY signup_month;×100 누락. *1.0 만으로는 비율(0.23)이지 퍼센트가 아니다.f.fp IS NOT NULL 은 안 써도 된다. NULL 과의 비교는 NULL 이라 CASE 가 거짓으로 떨어진다.“가입 후 7일 이내 재방문율”, “첫 구매까지 N일 이내 비율” — 날짜 기준만 바뀐다.