Mysql 我可以根据group by值向计数中添加条件吗
我正在尝试指定月份的每月活动计数。 从我们的第一个用户开始的所有月份中,有多少用户在本月底之前被创建而没有存档 给定此数据集()Mysql 我可以根据group by值向计数中添加条件吗,mysql,date,Mysql,Date,我正在尝试指定月份的每月活动计数。 从我们的第一个用户开始的所有月份中,有多少用户在本月底之前被创建而没有存档 给定此数据集() 创建表用户( id INT非空自动增量, 在DATETIME创建的\u不为空, 在DATETIME存档, 主键(id) ); 插入用户(创建时、存档时)值('2020-01-01',空); 插入用户(创建时、存档时)值('2020-01-01',空); 插入用户(创建时、存档时)值(“2020-01-01”、“2020-01-02”); 插入用户(创建时、存档时)值(
创建表用户(
id INT非空自动增量,
在DATETIME创建的\u不为空,
在DATETIME存档,
主键(id)
);
插入用户(创建时、存档时)值('2020-01-01',空);
插入用户(创建时、存档时)值('2020-01-01',空);
插入用户(创建时、存档时)值(“2020-01-01”、“2020-01-02”);
插入用户(创建时、存档时)值('2020-02-01',空);
我在找像这样的东西
2020-01 -> 2
2020-02 -> 3
我正在尝试向我的计数中添加一个条件,以便仅统计在组的当前月份未存档的用户
select date_format(created_at, '%Y-%m-01') as date, count(*)
from users
where archived_at is null or (archived_at BETWEEN date AND last_day(date))
group by date
这不起作用:where子句中的未知列“date”
select date_format(created_at, '%Y-%m-01') as date, count(CASE WHEN (archived_at > date) then 1 else 0 END)
from users
where archived_at is null or (archived_at BETWEEN date AND last_day(date))
group by date;
这会产生类似的错误:字段列表中的未知列“日期”好的,重写我的答案。这将教会我在没有测试的情况下发布任何东西
select date_format(created_at, '%Y-%m-01') as date, count(CASE WHEN (archived_at > date) then 1 else 0 END)
from users
where archived_at is null or (archived_at BETWEEN date AND last_day(date))
group by date;
select extract(year_month from created_at) as date, count(*) as count
from users
where archived_at is null or archived_at > last_day(created_at)
group by date;
我在MySQL 5.7.27上对此进行了测试,根据您的输入数据,结果如下:
+--------+-------+
| date | count |
+--------+-------+
| 202001 | 2 |
| 202002 | 1 |
+--------+-------+
除了在
HAVING
子句中,不能在同一查询中引用列别名
但在您的情况下,您只需要检查在创建的和在
存档的是否在同一个月,这样您就可以比较它们了
SELECT date_format(created_at, '%Y-%m') AS date, SUM(archived_at IS NULL OR archived_at > created_at) AS count
FROM users
WHERE archived_at IS NULL OR YEAR(created_at) = YEAR(archived_at) AND MONTH(created_at) = MONTH(archived_at)
您不能在同一查询的where
子句中引用列别名。您说过要计算它们在同一个月内没有存档的时间,所以不应该是而不是介于之间吗?谢谢您的回答,但我无法使这两个查询都起作用。它们都在where子句中返回未知列“date”last\u day(date)
应该是last\u day(created\u at)
Fixed。这证明了在发布查询之前实际测试查询的价值。但在你或戈登·林诺夫回答之前,我只是想得到一个奇怪的答案。:-)@BillKarwin抱歉,这不起作用,我假设您在第二个查询中也指的是日期(创建时间),而不是日期,但返回2021-01->1,2021-02->nullThis返回2020-01->1I忘记存档时间为NULL
这并没有给出我期望的结果。我不太理解您对期望结果的描述。是否要将创建时当月的存档计数?日期介于日期和最后一天(日期)之间的存档日期看起来是同一个月。