似乎无法按月分组
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)
【讨论】:
以上是关于似乎无法按月分组的主要内容,如果未能解决你的问题,请参考以下文章