有没有一种简单的方法来做一个GROUP BY DATE(timestamp)
包括一段时间内所有天的方法,不管是否有任何与该日期相关的记录?
基本上,我需要生成这样的报告:
24 Dec - 0 orders
23 Dec - 10 orders
22 Dec - 8 orders
21 Dec - 2 orders
20 Dec - 0 orders
假设您的订单比日期多,这样的事情可能会奏效:
select date, count(id) as orders
from
(
SELECT DATE_ADD('2008-01-01', INTERVAL @rn:=@rn+1 DAY) as date from (select @rn:=-1)t, `order` limit 365
) d left outer join `order` using (date)
group by date
一种方法是创建一个日历表并加入它。
我会永久创建它,然后创建一个插入新日期的任务,它可以每周、每天、每月等完成。
请注意,我假设您将时间戳转换为日期。
不要使用 GROUP BY,而是创建一个包含您想要的特定日期的表(可能是一个临时表),例如:
24 Dec
23 Dec
22 Dec
21 Dec
20 Dec
然后,将该表连接到 Orders 表。
您需要生成一个中间结果集,其中包含您希望包含在输出中的所有日期...
如果您在存储过程中执行此操作,那么您可以创建一个临时表或表变量(我不知道 MySQL 的功能),但是一旦您在表或某种结果集中拥有所有日期
只需使用外连接从临时表连接到真实数据
在 SQL Server 中是这样的
Declare @Dates Table (aDate DateTime Not Null)
Declare @StartDt DateTime Set @StartDt = 'Dec 1 2008'
Declare @EndDt DateTime Set @EndDt = 'Dec 31 2008'
While @StartDt < @EndDt Begin
Insert @Dates(aDate) Values(@StartDt)
Set @StartDt = DateAdd(Day, 1, @StartDt)
End
Select D.aDate, Count(O.*) Orders
From @Dates D Left Join
OrderTable O On O.OrderDate = D.aDate
Group By D.aDate
在数据仓库中,采用的方法是创建一个包含所有日期的表,并在您的数据和日期表之间创建一个外键。我并不是说这是针对您的情况的最佳方法,只是说在需要以多种方式汇总大量数据以进行报告的情况下,这是最佳实践。
如果您在 SQL Server 上使用报告层,您可以编写一些逻辑,在数据返回之后和呈现报告之前在感兴趣的范围内插入缺失的日期。
如果您直接从 SQL Server 创建报表并且您还没有数据仓库,并且现在没有时间或需要创建一个,我将创建一个日期表并加入它。进行连接和获得所需输出所需的格式可能有点不稳定,但它会完成工作。
有一种非常简单的方法可以做到这一点……除了我不记得了。但我从这个线程改编了这个查询:
SELECT
DISTINCT(LEFT(date_field,11)) AS `Date`,
COUNT(LEFT(date_field,11)) AS `Number of events`
FROM events_table
GROUP BY `Date`
它也适用于 MySQL