Mysql SQL按日期分组,但也获取不带记录的日期

Mysql SQL按日期分组,但也获取不带记录的日期,mysql,group-by,Mysql,Group By,是否有一种简单的方法来按日期分组(时间戳),该方法包括一段时间内的所有天,而不管是否有任何与该日期相关的记录 基本上,我需要生成如下报告: 24 Dec - 0 orders 23 Dec - 10 orders 22 Dec - 8 orders 21 Dec - 2 orders 20 Dec - 0 orders 一种方法是创建一个日历表并与之关联 我会永久性地创建它,然后创建一个任务来插入新的日期,可以每周、每天、每月等等 请注意,我假设您正在将时间戳转换为日期。不使用GROUP BY

是否有一种简单的方法来按日期分组(时间戳),该方法包括一段时间内的所有天,而不管是否有任何与该日期相关的记录

基本上,我需要生成如下报告:

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

一种方法是创建一个日历表并与之关联

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


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

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

24 Dec
23 Dec
22 Dec
21 Dec
20 Dec

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

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

如果您在存储过程中执行此操作,那么您可以创建一个临时表或表变量(我不知道MySQL的功能),但一旦您在一个表或某种结果集中拥有了所有日期

只需使用外部连接从临时表连接到实际数据A

在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
Declare@Dates表(aDate DateTime非空)
声明@StartDt DateTime Set@StartDt='2008年12月1日'
声明@EndDt日期时间集@EndDt='2008年12月31日'
当@StartDt<@EndDt开始时
插入@Dates(aDate)值(@StartDt)
设置@StartDt=DateAdd(第1天,@StartDt)
终点
选择D.aDate,计数(O*)个订单
从@D左连接
O.OrderDate=D.aDate上的OrderTable O
D.aDate分组

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

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


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

假设您的订单多于日期,类似的操作可能会奏效:

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

有一个非常简单的方法可以做到这一点…除了我记不起来了。但我将这个问题改编自:


它在MySQL中也能工作

这是一个维护难题,尽管它的性能比创建一个动态生成列表的SP要好。这里的维护问题实际上意味着创建日历表是不合适的。你最终会得到一个日历表,它是整个数据库的中心,调试变得非常困难。@Neil,我必须说我同意,但我不喜欢动态创建日历表,当然,除非它是定期创建的,而不是经常创建。我想没有一个明显的方法可以做到这一点,但我想我会问。感谢所有回答的人。虽然这是一个有效的方法,但下面的Thangalin的回答是通过编程实现的,而不必创建任何新表。Thangalin说,“在Oracle中”,但OP将问题标记为“mysql”。我知道必须有一种方法可以在没有日历或数字表的情况下实现这一点。这很容易适应其他时间间隔(我需要每15分钟分组一次)。这不起作用,因为它会忽略任何没有事件的日期。啊,是的。我想这个答案只有在你愿意以编程的方式填空的情况下才能考虑
SELECT 
    DISTINCT(LEFT(date_field,11)) AS `Date`,
    COUNT(LEFT(date_field,11)) AS `Number of events`
FROM events_table
GROUP BY `Date`