MySQL-按日期分组并统计数量

16

我正在尝试找出获取所需查询结果的正确语法。以下是情境:

我正在设计一个SaaS应用程序,有一个名为“trips”的表,就像这样:

table.trips  
- trip_id (pk, ai)  
- client_id (fk)  
- shop_id (fk)
- trip_date (date)
我需要能够获取每天(按商店ID)表格中的旅行次数,并按trip_date提供每个TRIP的数量,例如:
DATE         | TRIP SUM  
--------------------------
01-01-2011   | 3
01-02-2011   | 2  
01-03-2011   | 5

你对正确的语法有什么想法吗?


“按商店ID排序”是什么意思?你的结果集中没有shop_id - Quassnoi
5个回答

31
SELECT COUNT(*), trip_date , shop_id 
FROM trips 
GROUP BY trip_date , shop_id

2
你需要删除WHERE条件或者加入一个WHERE条件。现在的写法是无效的SQL语句。 - Ken White
太好了:-) 感谢您的帮助。添加了 WHERE shop_id=#,它完美地工作了。干杯。 - teustis
3
SELECT COUNT(*) AS customvar 总是有助于返回结果。 - Onimusha

11

如果日期列中还包含小时和分钟,您需要应用子字符串函数来仅获取日期列的yyyy-mm-dd部分,如下所示:

SELECT COUNT(*), substring(trip_date,1,10)
FROM trips
GROUP BY substring(trip_date,1,10);

这刚刚为我节省了很长时间,因为我一直在尝试按日期而不是时间编译行数。 - Furison

4

像这样的吗?

select 
   DATE(trip_date) as [DATE],
   count(1) as [TRIP SUM]
from
   trips
group by
   DATE(trip_date), shop_id

我不是mySQL专家,但你需要使用T-SQL的DatePart等效函数来替代我使用的DATE()函数,以便去除日期中的时间部分。


2
SELECT shop_id, trip_date, count(trip_id)
FROM trips
GROUP BY shop_id, trip_date

请花点时间扩展一下这个仅包含代码的答案,解释它是如何工作的以及为什么这是一个好主意。当新用户看到高声望用户发布的仅包含代码的答案时,他们会认为这就是“在SO上的做法”。请为他们的利益树立更好的发布行为榜样 - 更不用说为未来的研究者带来好处了。 - mickmackusa

2
select trip_date,count(*)
from trips
where shop_id=[the shop id]
group by trip_date

只要日期格式符合您展示的格式,这个方法就可以奏效。如果日期还包括时间,则需要去掉时间部分。
另外,我不确定查询中是否必须包含client_id,如果你也需要按照它进行分组,则必须将其与trip_date一起放在select或group语句中。如果想要按照client_id进行过滤,则需要将其放在where语句中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接