计算使用SQL的返回用户百分比

时间:2014-06-02 00:27:32

标签: mysql

我想计算按月返回的不同用户, 我认为这个查询的主要问题是它在10月或11月选择用户我希望成为AND。

SELECT (

SELECT COUNT( DISTINCT table.user ) 
FROM table
WHERE table.month IN (october)

) / (

SELECT COUNT( DISTINCT table.user ) 
FROM table
WHERE table.month IN (october,november)

)*100 AS return_users

表格结构

    user month 

    jack october 
    jack november 
    jack november 
    jack november 
    sam november 
    john october 
    john october 

3 个答案:

答案 0 :(得分:2)

我认为更简单的方法来处理这种类型的查询是使用子查询。首先在用户级别汇总,跟踪他们是否在10月/ 11月。然后总结最终结果:

select sum(inoctober > 0 and innovember > 0) / sum(inoctober)*100 as percent_returning
from (select t.user, max(t.month in (october)) as inoctober,
             max(t.month in (november)) as innovember
      from table t
      where t.month in (october, november)
      group by t.user
     ) t;

答案 1 :(得分:1)

如果我理解正确,你需要数量不同的用户,10月和11月的所有用户10月除以。也就是说,11月份返回的用户百分比。

首先,明确了11月份访问过的所有用户的数量。这是通过EXISTS完成的,以查找每个用户在该月份中存在的先前记录。

其次,在十月份获得所有用户的明确计数。

然后你就分开了。

这是SQL Fiddle example

SELECT
(
    SELECT COUNT( DISTINCT t1.user )
    FROM mytable t1
    WHERE t1.month = 'November'
    AND EXISTS (
        SELECT *
        FROM mytable t2
        WHERE t2.user = t1.user
        AND t2.month = 'October'
    )
)
/
(
    SELECT COUNT( DISTINCT mytable.user )
    FROM mytable
    WHERE mytable.month = 'October'
) * 100

答案 2 :(得分:0)

据我了解,您可以将查询设置为:

table.date IN(十月) AND table.date IN(11月)

INSTEAD OF: table.date IN(十月,十一月)

希望这有帮助。