SQL按日期分组,但也得到没有记录的日期

时间:2008-12-30 16:33:03

标签: mysql group-by

是否有一种简单的方法来执行包含一段时间内所有日期的GROUP BY DATE(timestamp),无论是否有与该日期相关的记录?

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

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

6 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:2)

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

24 Dec
23 Dec
22 Dec
21 Dec
20 Dec

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

答案 3 :(得分:0)

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

如果你在存储过程中这样做,那么你可以创建一个临时表或表变量(我不知道MySQL的功能),但是一旦你在某个表或结果集中有所有日期< / p>

使用外部联接

加入临时表中的真实数据

在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

答案 4 :(得分:0)

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

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

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

答案 5 :(得分:-1)

这是一种非常简单的方法......除了我无法记住它。但是我从this thread改编了这个查询:

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

它也适用于MySQL