我正在为我的一位客户制作统计程序,但我似乎无法弄清楚如何计算转换率。
表格如下:
User_id order_id plan_id
12 12 16
12 13 2
12 14 2
14 15 5
14 16 16
15 17 16
订单ID 16
是试用版,其余部分已付款。所以你可以看到用户15,只有一个试用版。所以他没有将免费转换为付费。
用户12和14都有试用(plan_id = 16)和付费计划(plan_id<> 16),这意味着他从免费转换为付费。
所以我正在寻找一个计算转换率的方向指针。我正在寻找一个查询(或输出我需要的数量):
Converted Notconverted
1200 1800
这适用于用户。那么有多少用户为试用过的帐户付了钱。
我有这个问题;但我似乎无法将其分组给用户,因为它显然会返回更多行。
SELECT (SELECT COUNT(*) AS TotalOrders FROM orders where (plan_id<>17) GROUP BY user_id) AS SuccessCount, (SELECT COUNT(*) AS TotalFreeAccounts FROM orders where (plan_id=16) GROUP BY user_id) AS TrialCount
到目前为止,我们遇到了以下查询,该查询似乎适用于已转换的查询。但不适合未转换的。作为一个小调整,计划17也是一个试用:
SELECT
count(Distinct TN2.user_id) as Converted,
count(Distinct TN.user_id) as NotConverted
FROM orders TN
INNER JOIN orders TN2
on TN.user_id = TN2.user_id
and (TN.plan_id = 16 OR TN.plan_id = 17)
and (TN2.plan_id <> 16 AND TN2.plan_id<>17)
结果完全相同,但这是不可能的
它们都被设置为相同的数字,这是可能的。我很确定这对于未转换的是正确的。
提前感谢您的帮助。
答案 0 :(得分:1)
假设我理解这个问题:
使用自我加入查找有试用的用户(计划16)并加入同一用户,该用户的计划不是试用(非计划16)
LEFT JOIN使用,因为我们对那些从TryOut开始然后可能已成为非tryoutplan的人感兴趣。我们并不关心那些没有试用的用户。
使用了Distinct,因为我们不关心我们的计数中的非试用计划,只是任何计划。
所以在你的例子中:
User_id order_id plan_id
12 12 16
12 13 2
12 14 2
14 15 5
14 16 16
15 17 16
以下查询的结果应该产生(假设逻辑和语法合理)
CONVERTED NOTCONVERTED
2 1
用户15有一个试用计划,但没有其他人,因此没有转换。 用户12有一个试用计划和多个非试用,因此只计算一次。 用户14有一个试用计划和另一个计划,因此被计算一次。
SELECT count(Distinct TN2.user_ID) as Converted,
count(Distinct TN.User_ID) as NotConverted
FROM tableName TN
LEFT JOIN TableName TN2
on TN.User_ID = TN2.user_ID
and TN.Plan_ID = 16
and TN2.Plan_ID <> 16