2008-12-30 73 views
2

是否有一种简单的方法可以执行GROUP BY DATE(timestamp),其中包含一段时间内的所有日期,而不管该日期是否有任何记录?SQL group by date,but get dates w/o too too

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

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

提花有没有这样做的一个明显的方式,但想我会问。感谢所有回应的人。 – ceejayoz 2008-12-30 17:15:53

回答

2

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

24 Dec 
23 Dec 
22 Dec 
21 Dec 
20 Dec 

然后,加入该表Orders表。

+0

虽然有效的方法,Thangalin的答案编程方式做到这一点,而无需创建任何新表。 – glasnt 2009-06-22 23:19:37

3

一种方法是创建一个日历表,并加入反对。

我将永久创建它,然后创建将插入新日期的任务,它可以做到每周,每天,每月等

。注意,我假设你正在转换的时间戳成一个约会。

+0

虽然它的性能比创建一个动态生成列表的SP更高效,但这有点维护困难。 – 2008-12-30 16:37:27

+0

这里的维护问题确实意味着创建日历表并不合适。你最终会得到一个日历表,这是整个数据库的中心,调试变得非常困难。 – 2008-12-30 16:42:24

+0

@尼尔,我必须说我同意,但我不喜欢随时随地创建日历表,除非是定期进行,而不是经常进行。 – LeppyR64 2008-12-30 17:01:00

0

你需要生成的中间结果与所有在它要包括在输出中的日期设置...

,如果你在一个存储过程中这样做,那么你可以创建一个临时表或表变量(我不knoiw MySQL的能力),但一旦你有某种

刚刚加入到从临时表中的实际DataA的一个表或结果集的所有日期,使用外连接

在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 
0

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

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

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

5

假设你有更多的订单比日期这样的事情可以工作:

select date, count(id) as orders 
from 
(
    SELECT DATE_ADD('2008-01-01', INTERVAL @rn:[email protected]+1 DAY) as date from (select @rn:=-1)t, `order` limit 365 
) d left outer join `order` using (date) 
group by date 
-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太