MySQL Fetch月份明智的注册用户总数为一个日历年

时间:2016-11-25 03:54:38

标签: mysql sql count report monthcalendar

我试图在一个日历年中获取月份总注册用户,例如2016年。查询需要考虑到之前的注册用户,直到2015年12月,并在2016年每月将其添加到注册用户。

以下是我尝试获取总注册用户数,但是,它有两个问题: 1.它跳过没有新注册用户的行 2.在计算总用户数时,它也不计算以前注册的用户。

SELECT tots.*, @var := @var + tots.`monthlyUsers` as totalUsers 
FROM (
SELECT m.monthNum,
    YEAR(from_unixtime(u.createdDate)) AS `year`,
    MONTH(from_unixtime(u.createdDate)) AS `month`,
    COUNT(*) AS `monthlyUsers`
FROM user u
GROUP BY `year`, `month` ) AS tots, (SELECT @var := 0) AS inc

这样的结果就像

year  month monthlyUsers totalUsers
------------------------------------
2015    1       2              2 
2016    1       3              5
2016    10      1              6
2016    11      2              8

我如何克服这两个问题?

修改 我设法获取上一年的记录并将其添加到今年的数据

SELECT tots.*, @var := @var + tots.`monthlyUsers` as totalUsers FROM (
SELECT 
    YEAR(from_unixtime(u.createdDate)) AS `year`,
    MONTH(from_unixtime(u.createdDate)) AS `month`,
    COUNT(*) AS `monthlyUsers`
FROM  user u
where YEAR(from_unixtime(u.createdDate)) ='2016'
GROUP BY `year`, `month` ) AS tots, (SELECT @var from (select @var :=count(u.id ) from  user u where year(from_unixtime(u.createdDate)) < '2016') as var) AS inc

这会取我的

year  month monthlyUsers totalUsers
------------------------------------
2016    1       3              5
2016    10      1              6
2016    11      2              8

但我的预期结果是

year  month monthlyUsers totalUsers
------------------------------------
2016    1       3              5
2016    2       0              5
2016    3       0              5  
2016    4       0              5
2016    5       0              5
2016    6       0              5  
2016    7       0              5
2016    8       0              5
2016    9       0              5  
2016    10      1              6
2016    11      2              8
2016    12      0              8

1 个答案:

答案 0 :(得分:0)

从不FROM子句中使用逗号。 始终使用明确,正确的JOIN语法。至少有一个问题是您需要LEFT JOIN

SELECT um.*, 
       (@var := @var + COALESCE(um.monthlyUsers, 0)) as totalUsers 
FROM months m LEFT JOIN
     (SELECT m.monthNum,
             YEAR(from_unixtime(u.createdDate)) AS `year`,
             MONTH(from_unixtime(u.createdDate)) AS `month`,
             COUNT(*) AS `monthlyUsers`
      FROM user u
      GROUP BY `year`, `month`
     ) um
     ON m.monthNum = um.monthNum CROSS JOIN
     (SELECT @var := 0) AS inc
ORDER BY `year`, `month`;

我不确定如何添加其余用户。虽然JOIN条件可能也应包括年份,但此查询似乎并未过滤掉任何内容。