SQL 实战:用户访问 → 下单 → 支付全流程转化率分析
目录
一、前言
二、业务理解
三、数据结构示例
四、SQL 实现思路
五、进阶拓展
1. 按渠道分组统计
2.按日期维度看趋势
3. 留存衍生:支付后复购率
六、总结
一、前言
在数据分析面试中,[转化率] 是出现频率最高的指标之一。
尤其是电商类场景,从用户访问到下单再到支付,是最经典的业务漏斗。
今天我们用一段完整SQL,带你搞懂:
如何用 SQL 计算访问→下单→支付的全流程转化率。
二、业务理解
在典型的用户转化链路中:
访问 -> 下单 -> 支付
我们希望了解:
- 有多少人访问了?
- 其中有多少人下了单?
- 又有多少人最终支付成功?
于是我们定义三个指标:
| 指标名称 | 含义 | 公式 |
|---|---|---|
| 访问转下单率 | 下单用户数 / 访问用户数 | 衡量访问后下单的比例 |
| 下单转支付率 | 支付用户数 / 下单用户数 | 衡量下单后支付的比例 |
| 总体转化率 | 支付用户数 / 访问用户数 | 衡量整体成交转化效果 |
三、数据结构示例
假设我们有三张表:
| 表名 | 含义 | 字段说明 |
|---|---|---|
visit_log | 用户访问日志 | user_id, visit_time |
order_log | 下单记录表 | user_id, order_id, order_time |
pay_log | 支付记录表 | order_id, pay_time |
四、SQL 实现思路
Step 1:统计每个阶段人数
-- 访问人数
SELECT COUNT(DISTINCT user_id) AS visit_uv FROM visit_log;--下单人数
SELECT COUNT(DISTINCT user_id) AS order_uv FROM order_log;--支付人数(需关联订单)
SELECT COUNT(DISTINCT o.user_id) AS pay_uv
FROM order_log o
JOIN pay_log p ON o.order_id = p.order_id;
Step 2:组合计算转化率(CTE写法)
WITH
visit AS (SELECT COUNT(DISTINCT user_id) AS visit_uv FROM visit_log
),
ord AS (SELECT COUNT(DISTINCT user_id) AS order_uv FROM order_log
),
pay AS (SELECT COUNT(DISTINCT o.user_id) AS pay_uvFROM order_log o JOIN pay_log p ON o.order_id = p.order_id
)
SELECT visit_uv,order_uv,pay_uv,ROUND(order_uv * 1.0 / visit_uv, 4) AS visit_to_order_rate,ROUND(pay_uv * 1.0 / order_uv, 4) AS order_to_pay_rate,ROUND(pay_uv * 1.0 / visit_uv, 4) AS total_conversion_rate
FROM visit, ord, pay;
Step 3:结果展示
| 指标 | 数值 | 含义 |
|---|---|---|
| visit_uv | 10,000 | 访问用户数 |
| order_uv | 3,500 | 下单用户数 |
| pay_uv | 2,800 | 支付用户数 |
| visit_to_order_rate | 0.35 | 访问→下单转化率 |
| order_to_pay_rate | 0.80 | 下单→支付转化率 |
| total_conversion_rate | 0.28 | 总体转化率 |
五、进阶拓展
1. 按渠道分组统计
想分析不同来源(如广告投放、搜索、自然流量)的转化效果,可以这样写:
SELECTv.channel,COUNT(DISTINCT v.user_id) AS visit_uv,COUNT(DISTINCT o.user_id) AS order_uv,COUNT(DISTINCT p.user_id) AS pay_uv,ROUND(COUNT(DISTINCT o.user_id)*1.0 / COUNT(DISTINCT v.user_id), 4) AS visit_to_order_rate,ROUND(COUNT(DISTINCT p.user_id)*1.0 / COUNT(DISTINCT o.user_id), 4) AS order_to_pay_rate
FROM visit_log v
LEFT JOIN order_log o ON v.user_id = o.user_id
LEFT JOIN (SELECT o.user_idFROM order_log oJOIN pay_log p ON o.order_id = p.order_id
)p ON v.user_id = p.user_id
GROUP BY v.channel;
这样你就能快速得到:
- 每个渠道的访问人数、下单人数、支付人数
- 各阶段转化率对比
2.按日期维度看趋势
可以按天(或周)分析转化率的变化:
SELECTDATE(v.visit_time) AS dt,COUNT(DISTINCT v.user_id) AS visit_uv,COUNT(DISTINCT o.user_id) AS order_uv,COUNT(DISTINCT P.user_id) AS pay_uv,ROUND(COUNT(DISTINCT o.user_id)*1.0 / COUNT(DISTINCT v.user_id), 4) AS visit_to_order_rate,ROUND(COUNT(DISTINCT p.user_id)*1.0 / COUNT(DISTINCT o.user_id), 4) AS order_to_pay_rate
FROM visit_log v
LEFT JOIN order_log o ON v.user_id = o.user_id
LEFT JOIN (SELECT FROMJOIN
)p ON v.user_id = p.user_id
GROUP BY DATE(v.visit_time)
ORDER BY dt;
3. 留存衍生:支付后复购率
在支付阶段基础上,你还可以计算:
- 支付后 7 日复购人数 / 支付用户数
SELECTCOUNT(DISTINCT CASE WHEN DATEDIFF(next_order_time, pay_time) <= 7 THEN user_id END) / COUNT(DISTINCT user_id) AS repurchase_rate_7d
FROM ...
六、总结
| 要点 | 说明 |
|---|---|
| 核心逻辑 | 明确三个阶段:访问 → 下单 → 支付 |
| 技术实现 | CTE / JOIN / DISTINCT |
| 进阶方向 | 分渠道、分时间、留存衍生分析 |
| 面试加分 | 能讲出业务含义 + 优化思路(如去重口径、时间范围) |
一句话总结:
SQL 转化率分析的关键,不是语法复杂,而是要“用 SQL 思维还原业务漏斗”。
