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

相关推荐
那我掉的头发算什么4 小时前
【Mybatis】Mybatis-plus使用介绍
服务器·数据库·后端·spring·mybatis
倔强的石头1064 小时前
关系数据库替换用金仓:数据迁移过程中的完整性与一致性风险
数据库·kingbase
_Johnny_4 小时前
ETCD 配额/空间告警模拟脚本
数据库·chrome·etcd
静听山水4 小时前
StarRocks查询加速
数据库
静听山水4 小时前
StarRocks高级特性
数据库
范纹杉想快点毕业4 小时前
从单片机基础到程序框架:全方位技术深度解析
数据库·mongodb
晚风_END4 小时前
Linux|操作系统|elasticdump的二进制方式部署
运维·服务器·开发语言·数据库·jenkins·数据库开发·数据库架构
devmoon4 小时前
Polkadot SDK 自定义 Pallet Benchmark 指南:生成并接入 Weight
开发语言·网络·数据库·web3·区块链·波卡
华农DrLai5 小时前
Spark SQL Catalyst 优化器详解
大数据·hive·sql·flink·spark
数据知道5 小时前
PostgreSQL 故障排查:紧急排查与 SQL 熔断处理(CPU 占用 100% 等情况)
数据库·sql·postgresql