似乎无法按月分组

Posted

技术标签:

【中文标题】似乎无法按月分组【英文标题】:Can't Seem to Group By Month 【发布时间】:2020-09-30 01:08:08 【问题描述】:

我一直在寻找如何处理一般日期背后的逻辑,在这种情况下,按日期分组。

我有一个如下所示的表格:

我目前正在尝试统计2016年发生的旅行次数并按月分组,我最近的尝试如下:

SELECT 
    DATE_FORMAT(start_date, '%y-%m'), COUNT(id)
FROM
    trips
WHERE
    start_date BETWEEN '2016-01-01' AND '2016-12-31'
GROUP BY YEAR(start_date) , MONTH(start_date);

错误是:

错误代码:1055。SELECT 列表的表达式 #1 不在 GROUP BY 中 子句并包含非聚合列“bixi.trips.start_date”,其中 在功能上不依赖于 GROUP BY 子句中的列;这是 与 sql_mode=only_full_group_by 不兼容

我还没有真正掌握使用日期的窍门,比如 group by 等等,而且我发现的网站(here和here)并不是特别有用。

感谢您的宝贵时间!

【问题讨论】:

而不是 DATE_FORMAT 您应该尝试 YEAR(date_column), MONTH(date_column) 或将 group by 更改为您当前的 DATE_FORMAT() 语句。该错误是因为您正在对字符串(DATE_FORMAT())执行聚合函数但试图将表分组为整数值(YEAR()MONTH() 【参考方案1】:

这似乎很清楚。只需在group by 中使用与select 中相同的表达式即可:

SELECT DATE_FORMAT(start_date, '%y-%m'), COUNT(id)
FROM trips
WHERE start_date BETWEEN '2016-01-01' AND '2016-12-31'
GROUP BY DATE_FORMAT(start_date, '%y-%m');

我也劝你不要使用BETWEEN。逻辑更安全地写成:

WHERE start_date >= '2016-01-01' AND start_date < '2017-01-01'

这样更安全,因为它适用于日期和日期时间。

【讨论】:

【参考方案2】:
select datePart(yy, start_date), datePart(mm, start_date), count(*)
from trips
where start_date >= '2016-01-01' and start_date < '2017-01-01'
group by datePart(yy, start_date), datePart(mm, start_date)
order by datePart(yy, start_date), datePart(mm, start_date)

【讨论】:

以上是关于似乎无法按月分组的主要内容,如果未能解决你的问题,请参考以下文章

mysql 如何按月分组查询出当前年度每个月的短信数量(数据库中这个月要是为空的话就用0条怎么显示出来)

mycat:水平分库之按月分库

Eloquent - 按月、年和分页分组

如何按月对数组中的值进行分组?

Hibernate Projection 按月分组

SQL按月统计,按日分组