考虑一下,我有一个表“Sales”,其中包含“user_id”、“product_id”、“timestamp”和“purchase_status”列。如何编写 SQL 查询来计算销售漏斗每个阶段的用户转化率(例如,查看产品、添加到购物车、完成购买)。
示例:
用户ID | 产品_id | 时间戳 | 购买状态 |
---|---|---|---|
1 | A | 2023-07-25 08:15:00 | 已查看 |
2 | B | 2023-07-25 09:30:00 | 已添加到购物车 |
1 | A | 2023-07-25 10:00:00 | 已完成 |
3 | C | 2023-07-25 12:45:00 | 已查看 |
2 | B | 2023-07-25 14:20:00 | 已完成 |
期望的结果:
购买状态 | 查看的用户 | 已添加到购物车用户 | 已完成_用户 | 总用户数 |
---|---|---|---|---|
已查看 | 2 | 0 | 0 | 2 |
已添加到购物车 | 0 | 1 | 0 | 1 |
已完成 | 1 | 0 | 2 | 3 |
我尝试编写如下查询:
SELECT
purchase_status,
SUM(CASE WHEN purchase_status = 'viewed' THEN 1 ELSE 0 END) AS viewed_users,
SUM(CASE WHEN purchase_status = 'added_to_cart' THEN 1 ELSE 0 END) AS added_to_cart_users,
SUM(CASE WHEN purchase_status = 'completed' THEN 1 ELSE 0 END) AS completed_users,
COUNT(*) AS total_users
FROM Sales
GROUP BY purchase_status
ORDER BY
CASE
WHEN purchase_status = 'viewed' THEN 1
WHEN purchase_status = 'added_to_cart' THEN 2
WHEN purchase_status = 'completed' THEN 3
END;
但是给出如下结果是错误的:
购买状态 | 查看的用户 | 已添加到购物车用户 | 已完成_用户 | 总用户数 |
---|---|---|---|---|
已查看 | 2 | 0 | 0 | 2 |
已添加到购物车 | 0 | 1 | 0 | 1 |
已完成 | 0 | 0 | 2 | 2 |
有人可以帮我吗?
一种有点幼稚的方法是首先“按用户”旋转数据,然后聚合。
这计算的是事件而不是用户。这意味着用户两次查看同一产品(甚至两次购买同一产品,相隔几个月)可能会导致结果出现偏差。这仅取决于您想要什么。
WITH
user_summary AS
(
SELECT
user_id,
product_id,
purchase_status,
SUM(CASE WHEN purchase_status = 'viewed' THEN 1 ELSE 0 END)
OVER (PARTITION BY user_id, product_id)
AS viewed_users,
SUM(CASE WHEN purchase_status = 'added_to_cart' THEN 1 ELSE 0 END)
OVER (PARTITION BY user_id, product_id)
AS added_to_cart_users,
SUM(CASE WHEN purchase_status = 'completed' THEN 1 ELSE 0 END)
OVER (PARTITION BY user_id, product_id)
AS completed users,
COUNT(*)
OVER (PARTITION BY user_id, product_id)
AS total_users
FROM
Sales
)
SELECT
purchase_status,
SUM(viewed_users),
SUM(added_to_cart_users),
SUM(completed_users),
SUM(total_users)
FROM
user_summary
GROUP BY
purchase_status
ORDER BY
CASE
WHEN purchase_status = 'viewed' THEN 1
WHEN purchase_status = 'added_to_cart' THEN 2
WHEN purchase_status = 'completed' THEN 3
END;