MySQL每用户转换率

时间:2014-03-28 16:32:31

标签: mysql e-commerce nested-query

我正在为我的一位客户制作统计程序,但我似乎无法弄清楚如何计算转换率。

表格如下:

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)

结果完全相同,但这是不可能的

它们都被设置为相同的数字,这是可能的。我很确定这对于未转换的是正确的。

提前感谢您的帮助。

1 个答案:

答案 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