一个日历年的MySQL Fetch Month明智的总注册用户数
问题描述:
我试图在一个日历年中获取明智的总注册用户数,例如2016年。该查询需要考虑到2015年12月之前的注册用户以及将其添加到注册用户每月在2016年。一个日历年的MySQL Fetch Month明智的总注册用户数
以下是我尝试获取总注册用户,但它有两个问题: 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
答
从不在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
条件也应该包括一年。
您可以添加包含数据类型和预期结果的示例数据吗?也提到DBMS。 –
'months'表是什么样的? –
其实我试图用月份数字创建一个月份表,因为它没有取得我所有的结果我决定删除它 – gameOne