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
这并没有给出我期望的结果。我不太理解您对期望结果的描述。是否要将创建时当月的存档计数?日期介于日期和最后一天(日期)之间的
存档日期看起来是同一个月。