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 思维还原业务漏斗"。

相关推荐
YOU OU4 小时前
Redis基础常识与命令
数据库·redis·缓存
Database_Cool_6 小时前
OLTP 和 OLAP 区别详解:分析型数据库和事务型数据库怎么选(附阿里云 AnalyticDB MySQL 选型指南)
数据库·mysql·阿里云
爱写代码的阿森7 小时前
鸿蒙三方库 | harmony-utils之KvUtil键值型数据库操作详解
数据库·华为·harmonyos·鸿蒙·huawei
Database_Cool_7 小时前
单机 MySQL 迁移到分布式数据库方便吗?阿里云 PolarDB-X 100% MySQL 协议兼容零改造平滑迁移
数据库·分布式·mysql
姜太小白8 小时前
【MySQL】 索引优化实战:解决 WHERE 等值 + IS NULL 查询,TEXT 字段报错 1167 的完整指南
数据库·mysql
窝子面8 小时前
手搓最简前后端协作-node
javascript·数据库
吳所畏惧9 小时前
宝塔面板Redis密码修改指南:SSH命令修改 vs 面板UI界面修改,哪个更靠谱?
运维·服务器·数据库·redis·缓存·ssh
DFT计算杂谈9 小时前
无 Root 权限在 Tesla K80 零门槛部署 DeepSeek 大模型
linux·服务器·网络·数据库·机器学习
HPFBoy9 小时前
log4net 数据库存日志正确配置
数据库