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

相关推荐
“αβ”3 小时前
MySQL表的操作
linux·网络·数据库·c++·网络协议·mysql·https
p***s913 小时前
Spring数据库原理 之 DataSource
java·数据库·spring
虹科网络安全3 小时前
艾体宝干货 | Redis Java 开发系列#1 从零开始的环境搭建与实践指南
java·数据库·redis
火山引擎开发者社区3 小时前
火山引擎向量数据库 Milvus 版正式商业化:AI 时代的向量检索新标杆
数据库·milvus·火山引擎
神秘的土鸡4 小时前
openEuler 25.09 企业级 MySQL主从复制部署与性能优化实战提升50%
linux·数据库·mysql·性能优化·openeuler
韩立学长4 小时前
基于Springboot课堂教学辅助系统08922bq1(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端
goxingman5 小时前
Oracle视图基础
数据库·oracle
黎相思5 小时前
MySQL索引特性
数据库·mysql
rit84324996 小时前
压缩感知信号恢复算法:OMP与CoSaMP对比分析
数据库·人工智能·算法