<think>我们正在处理一个关于MySQL客户复购率分析的SQL查询问题。根据引用内容,复购率通常指的是在特定时间段内,多次购买产品的客户比例。而回购率则指的是在后续时间段内再次购买的客户比例。
根据引用[2]中的定义:
- 复购:在同一个时间段(如一个月)内多次购买。
- 回购:在下一个时间段(如下一个月)内仍然购买。
用户要求的是复购率分析,因此我们将重点放在同一时间段内的重复购买行为上。
常见的复购率计算方法有两种(引用[2]):
方法一:复购率 = 重复购买客户数 / 总购买客户数(其中重复购买客户数指购买次数大于1的客户数)
方法二:复购率 = 总购买次数中除去第一次购买后的次数 / 总购买次数(即平均每个客户购买次数-1)
但通常,复购率指的是第一种方法,即重复购买客户数占总购买客户数的比例。
另外,引用[1]中提供的SQL计算的是跨月的复购(即购买月份和复购月份不同),这实际上更接近于回购率(或跨期复购)的概念。而用户现在需要的是复购率(同一时间段内多次购买),因此我们需要调整。
根据用户需求,我们应计算每个时间段(如每个月)内的复购率,即在该月内购买超过一次的客户数占该月总购买客户数的比例。
步骤:
1. 计算每个客户在每个月的购买次数。
2. 对每个月,统计总购买客户数(即去重的客户数)。
3. 对每个月,统计购买次数大于1的客户数(即复购客户数)。
4. 计算复购率 = 复购客户数 / 总购买客户数。
SQL查询思路:
- 首先,从订单表中提取每个客户每个月的购买记录,并计算每个客户每个月的购买次数。
- 然后,按月份分组,计算每个月的总客户数和复购客户数(购买次数>=2的客户数)。
- 最后,计算复购率。
假设订单表名为`orders`,包含字段`create_time`(订单创建时间)和`user_id`(客户ID)。
SQL语句如下:
```sql
SELECT
month,
COUNT(user_id) AS total_customers, -- 总购买客户数
SUM(IF(buy_times >= 2, 1, 0)) AS repeat_customers, -- 复购客户数(购买次数>=2)
CONCAT(ROUND(SUM(IF(buy_times >= 2, 1, 0)) / COUNT(user_id) * 100, 2), '%') AS repeat_rate
FROM (
SELECT
DATE_FORMAT(create_time, '%Y-%m') AS month,
user_id,
COUNT(*) AS buy_times -- 每个客户当月的购买次数
FROM orders
GROUP BY month, user_id
) AS monthly_purchase
GROUP BY month
ORDER BY month;
```
解释:
1. 子查询`monthly_purchase`:按月份和客户分组,计算每个客户在每个月的购买次数(`buy_times`)。
2. 外层查询:按月份分组。
- `total_customers`:该月购买的总客户数(因为每个客户在子查询中只有一行,所以COUNT(user_id)就是总客户数)。
- `repeat_customers`:使用条件判断,如果购买次数`buy_times`>=2,则计为1(复购客户),否则为0,然后求和得到复购客户总数。
- `repeat_rate`:复购客户数除以总客户数,并转化为百分比字符串。
注意:这里复购客户定义为在当月购买次数大于等于2的客户。
如果需要计算其他时间段(如按周、季度),只需调整日期格式(如`DATE_FORMAT(create_time, '%x-%v')`表示按周)。
另外,引用[1]中计算的是跨月复购(即回购),如果用户需要的是跨月复购(回购)率,则需使用不同的方法(如引用[1]中的SQL)。但根据问题描述,用户要求的是复购率,因此我们采用上述方法。
如果用户需要的是跨月复购(回购)率,我们可以这样理解:
- 回购率:在某个时间段(如月)购买过的客户,在下一个时间段(下个月)再次购买的比例。
例如,计算6月份的回购率:
- 分子:5月份购买过的客户中,在6月份也购买的客户数(即5月客户在6月有购买行为)。
- 分母:5月份的总购买客户数。
但用户问题明确要求复购率,因此我们提供上述同一时间段内的复购率计算方法。
如果用户需要,我们也可以提供回购率的计算方法,但问题只要求复购率。
因此,我们按照复购率的定义(同一时间段内重复购买)给出上述SQL。
最后,根据引用[3],我们也可以使用自连接来计算回购率,但这里不展开。
请用户根据实际需求调整时间段(如将月份改为周、季度等)以及复购次数的定义(如购买2次以上或3次以上等)。</think>### MySQL 客户复购率分析 SQL 查询
在电商数据分析中,**复购率**是指同一时间段内多次购买的用户比例,是衡量客户忠诚度的关键指标[^2]。以下是完整的复购率分析解决方案:
#### 1. 基础复购率计算(按月统计)
```sql
SELECT
DATE_FORMAT(create_time, '%Y-%m') AS 购买月份,
COUNT(DISTINCT user_id) AS 总用户数,
SUM(IF(购买次数 >= 2, 1, 0)) AS 复购用户数,
CONCAT(ROUND(SUM(IF(购买次数 >= 2, 1, 0)) / COUNT(DISTINCT user_id) * 100, 2), '%') AS 复购率
FROM (
SELECT
user_id,
DATE_FORMAT(create_time, '%Y-%m') AS 购买月份,
COUNT(order_id) AS 购买次数
FROM orders
GROUP BY user_id, DATE_FORMAT(create_time, '%Y-%m')
) AS user_monthly
GROUP BY 购买月份
ORDER BY 购买月份;
```
#### 2. 跨期回购率分析(月度回购)
```sql
SELECT
a.月份 AS 原始月份,
b.月份 AS 回购月份,
COUNT(DISTINCT b.user_id) AS 回购用户数,
COUNT(DISTINCT a.user_id) AS 原始用户数,
CONCAT(ROUND(COUNT(DISTINCT b.user_id) / COUNT(DISTINCT a.user_id) * 100, 2), '%') AS 回购率
FROM (
SELECT
DATE_FORMAT(create_time, '%Y-%m') AS 月份,
user_id
FROM orders
GROUP BY 月份, user_id
) a
LEFT JOIN (
SELECT
DATE_FORMAT(create_time, '%Y-%m') AS 月份,
user_id
FROM orders
GROUP BY 月份, user_id
) b ON a.user_id = b.user_id
AND b.月份 > a.月份 -- 仅统计后续月份的回购
AND PERIOD_DIFF(b.月份, a.月份) = 1 -- 仅统计下月回购
GROUP BY a.月份
ORDER BY a.月份;
```
#### 3. 多维度复购分析(商品+用户)
```sql
SELECT
product_id,
DATE_FORMAT(create_time, '%Y-%m') AS 月份,
COUNT(DISTINCT user_id) AS 购买用户数,
SUM(IF(购买次数 > 1, 1, 0)) AS 复购用户数,
CONCAT(ROUND(SUM(IF(购买次数 > 1, 1, 0)) / COUNT(DISTINCT user_id) * 100, 2), '%') AS 商品复购率
FROM (
SELECT
product_id,
user_id,
DATE_FORMAT(create_time, '%Y-%m') AS 月份,
COUNT(order_id) AS 购买次数
FROM orders
GROUP BY product_id, user_id, 月份
) AS product_analysis
GROUP BY product_id, 月份
HAVING 购买用户数 > 10 -- 过滤样本量过小的商品
ORDER BY 商品复购率 DESC;
```
### 关键概念说明:
1. **复购率**:同一时间段内购买≥2次的用户占比(如月复购率)[^2]
2. **回购率**:在后续时间段再次购买的用户比例(如6月客户在7月的回购率)[^3]
3. **计算逻辑**:
- 先按用户+时间粒度聚合购买次数
- 通过条件统计(`IF(购买次数 > 1, 1, 0)`)识别复购用户
- 使用`COUNT(DISTINCT )`确保用户去重
### 注意事项:
1. 时间粒度调整:将`DATE_FORMAT(create_time, '%Y-%m')`改为:
- `DATE_FORMAT(create_time, '%x-%v')` 按周统计
- `QUARTER(create_time)` 按季度统计
2. 复购定义:修改`IF(购买次数 >= 2, 1, 0)`中的阈值可调整复购标准
3. 性能优化:对大型数据集建议创建`(user_id, create_time)`的联合索引
> 示例数据说明:假设6月有100名客户,其中15人当月购买≥2次,则月复购率为15%;若这100人中有10人在7月再次购买,则7月回购率为10%[^2]。