我试图在一个日历年中获取月份总注册用户,例如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
答案 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
条件可能也应包括年份,但此查询似乎并未过滤掉任何内容。