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

相关推荐
咩咩不吃草5 分钟前
Linux环境下MySQL的安装与使用与Navicat
linux·运维·数据库·mysql·navicat
Aloudata5 分钟前
NoETL 指标平台如何保障亿级明细查询的秒级响应?——Aloudata CAN 性能压测深度解析
数据库·数据分析·自动化·指标平台
maoku666 分钟前
从关键词到语义:向量数据库如何让AI真正理解你的需求
数据库·人工智能
寻道码路7 分钟前
【MCP探索实践】Google GenAI Toolbox:Google开源的企业级AI数据库中间件、5分钟搞定LLM-SQL安全互联
数据库·人工智能·sql·开源·aigc
数据知道7 分钟前
PostgreSQL 核心原理:一文掌握 WAL 缓冲区与刷盘策略(性能与数据安全的权衡)
数据库·postgresql
三个人工作室10 分钟前
mysql允许所有ip地址访问,mysql允许该用户访问自己的数据库【伸手党福利】
数据库·tcp/ip·mysql
小小逐月者11 分钟前
SQLModel 开发笔记:Python SQL 数据库操作的「简化神器」
数据库·笔记·python
QQ828929QQ11 分钟前
MySQL Explain 分析 SQL 执行计划
数据库·sql·mysql
我是小超人-雨石花12 分钟前
postgresql + postgis安装
数据库·postgresql·postgis·空间数据库
码农很忙13 分钟前
SCALE发布《2025年12月大模型SQL能力排行榜》:格局与趋势洞察
数据库·业界资讯