SQL 实战:用户访问 → 下单 → 支付全流程转化率分析

目录

一、前言

二、业务理解

三、数据结构示例

[四、SQL 实现思路](#四、SQL 实现思路)

五、进阶拓展

[1. 按渠道分组统计](#1. 按渠道分组统计)

2.按日期维度看趋势

[3. 留存衍生:支付后复购率](#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:统计每个阶段人数

sql 复制代码
-- 访问人数
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写法)

sql 复制代码
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_uv
    FROM 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. 按渠道分组统计

想分析不同来源(如广告投放、搜索、自然流量)的转化效果,可以这样写:

sql 复制代码
SELECT
    v.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_id
    FROM order_log o
    JOIN pay_log p ON o.order_id = p.order_id
)p ON v.user_id = p.user_id
GROUP BY v.channel;

这样你就能快速得到:

  • 每个渠道的访问人数、下单人数、支付人数
  • 各阶段转化率对比

2.按日期维度看趋势

可以按天(或周)分析转化率的变化:

sql 复制代码
SELECT
    DATE(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 
    FROM
    JOIN
)p ON v.user_id = p.user_id
GROUP BY DATE(v.visit_time)
ORDER BY dt;

3. 留存衍生:支付后复购率

在支付阶段基础上,你还可以计算:

  • 支付后 7 日复购人数 / 支付用户数
sql 复制代码
SELECT
    COUNT(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 思维还原业务漏斗"。

相关推荐
lkbhua莱克瓦248 小时前
进阶-存储对象1-视图
java·数据库·sql·mysql·视图
yangminlei8 小时前
Spring Boot 自动配置原理与自定义 Starter 开发实战
java·数据库·spring boot
萧曵 丶8 小时前
Redis 由浅到深面试题(分层次版)
数据库·redis·缓存
-XWB-8 小时前
【Oracle】Oracle诊断系列(1/6):健康体检指南——快速掌握数据库状态
数据库·oracle
杨了个杨89828 小时前
Redis常用命令
数据库·redis·缓存
-XWB-8 小时前
【MySQL】XtraBackup 全量备份还原操作指南(MySQL 5.7 / 8.0 通用)
数据库·mysql·adb
Tancenter8 小时前
Mysql和ElasticsSearch
数据库·mysql·elasticsearch
fai厅的秃头姐!8 小时前
2026-1-13
数据库·mysql
dishugj9 小时前
【oracle】RMAN Catalog 与 Nocatalog 核心区别及实操指南
数据库·oracle·rman
heartbeat..9 小时前
MySQL 索引从入门到精通:核心概念、类型与实战优化
java·数据库·mysql·索引