编写 SQL 查询,计算销售漏斗各个阶段的用户转化率

Write an SQL query to calculate the conversion rate of users from each stage of the sales funnel

提问人:Rahul Nakod 提问时间:10/15/2023 最后编辑:Dale KRahul Nakod 更新时间:10/15/2023 访问量:157

问:

考虑一下,我有一个表“Sales”,其中包含列“user_id”、“product_id”、“timestamp”和“purchase_status”。如何编写 SQL 查询来计算销售漏斗每个阶段(例如,查看产品、添加到购物车、完成购买)的用户转化率。

例:

user_id product_id 时间戳 purchase_status
1 一个 2023-07-25 08:15:00
2 B 2023-07-25 09:30:00 added_to_cart
1 一个 2023-07-25 10:00:00 完成
3 C 2023-07-25 12:45:00
2 B 2023-07-25 14:20:00 完成

期望的结果:

purchase_status viewed_users added_to_cart_users completed_users total_users
2 0 0 2
Added_to_cart 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;

但是给出如下结果是错误的:

purchase_status viewed_users added_to_cart_users completed_users total_users
2 0 0 2
added_to_cart 0 1 0 1
完成 0 0 2 2

谁能帮帮我?

SQL Server 联接 计数 总和

评论

0赞 Ross Bush 10/15/2023
你遗漏了什么吗?您的查询看起来很干净,应该返回 1 表示已完成...
0赞 MatBailie 10/15/2023
用户是否可以有多个具有相同状态的行,如果是这样,结果应该是什么样子?
0赞 Ross Bush 10/15/2023
@MatBailie - purchase_status 是分组,因此上面的查询应考虑所有用户。
0赞 MatBailie 10/15/2023
@RossBush 我的评论不是针对你的,也不是与你的评论有关的。
0赞 Xabi 10/15/2023
我正在尝试遵循您期望的结果的逻辑,我相信最后一行应该是:|completed|1|1|2|4|由于“user_id”2有“added_to_cart”“product_id”B,后来“完成”购买

答:

1赞 MatBailie 10/15/2023 #1

一种有点幼稚的方法是首先“按用户”透视数据,然后进行聚合。

这会计算事件而不是用户。这意味着,用户两次查看同一产品(甚至两次购买同一产品,相隔几个月)可能会扭曲结果。这取决于你想要什么。

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;