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

问题描述 投票:0回答:1

考虑一下,我有一个表“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

有人可以帮我吗?

sql sql-server join count sum
1个回答
0
投票

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

这计算的是事件而不是用户。这意味着用户两次查看同一产品(甚至两次购买同一产品,相隔几个月)可能会导致结果出现偏差。这仅取决于您想要什么。

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;
© www.soinside.com 2019 - 2024. All rights reserved.