2

有没有一种简单的方法来做一个GROUP BY DATE(timestamp)包括一段时间内所有天的方法,不管是否有任何与该日期相关的记录?

基本上,我需要生成这样的报告:

24 Dec - 0 orders
23 Dec - 10 orders
22 Dec - 8 orders
21 Dec - 2 orders
20 Dec - 0 orders
4

6 回答 6

5

假设您的订单比日期多,这样的事情可能会奏效:

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
于 2008-12-30T17:50:26.580 回答
3

一种方法是创建一个日历表并加入它。

我会永久创建它,然后创建一个插入新日期的任务,它可以每周、每天、每月等完成。

请注意,我假设您将时间戳转换为日期。

于 2008-12-30T16:36:00.053 回答
2

不要使用 GROUP BY,而是创建一个包含您想要的特定日期的表(可能是一个临时表),例如:

24 Dec
23 Dec
22 Dec
21 Dec
20 Dec

然后,将该表连接到 Orders 表。

于 2008-12-30T16:39:14.853 回答
0

您需要生成一个中间结果集,其中包含您希望包含在输出中的所有日期...

如果您在存储过程中执行此操作,那么您可以创建一个临时表或表变量(我不知道 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
于 2008-12-30T16:42:14.177 回答
0

在数据仓库中,采用的方法是创建一个包含所有日期的表,并在您的数据和日期表之间创建一个外键。我并不是说这是针对您的情况的最佳方法,只是说在需要以多种方式汇总大量数据以进行报告的情况下,这是最佳实践。

如果您在 SQL Server 上使用报告层,您可以编写一些逻辑,在数据返回之后和呈现报告之前在感兴趣的范围内插入缺失的日期。

如果您直接从 SQL Server 创建报表并且您还没有数据仓库,并且现在没有时间或需要创建一个,我将创建一个日期表并加入它。进行连接和获得所需输出所需的格式可能有点不稳定,但它会完成工作。

于 2008-12-30T16:49:41.587 回答
-1

有一种非常简单的方法可以做到这一点……除了我不记得了。但我从这个线程改编了这个查询:

SELECT 
    DISTINCT(LEFT(date_field,11)) AS `Date`,
    COUNT(LEFT(date_field,11)) AS `Number of events`
FROM events_table
GROUP BY `Date`

它也适用于 MySQL

于 2014-10-10T21:15:13.953 回答