2014-08-27 70 views
0

我一直试图想出一个查询以特定的方式显示数据,我一直在努力。用于显示按日期递增的日期分组数据的MySQL查询

假设这些数据

ID Amount Date 
1 10  10/10/2014 13:45 
1 20  10/10/2014 14:56 
1 05  10/10/2014 22:45 
1 10  11/10/2014 23:04 
1 30  14/10/2014 03:00 
1 15  14/10/2014 04:34 
1 15  15/10/2014 13:34 
2 10  10/10/2014 16:05 

我想打电话给一个开始日期,查询和结束日期,显示每日排含有量的总和为一天的结果ID。 那么结果将是:

对于ID = 1,起始日期= 10/10/2014年和结束日期= 14/10/2014:

Date  Sum 
10/10/2014 35 
11/10/2014 10 
12/10/2014 0 
13/10/2014 0 
14/10/2014 45 

降至现在的我已经尝试过的事情,我创建在jFiddle脚本:

CREATE TABLE TableName 
    (`id` int, `amount` int, `timestamp` datetime) 
; 

INSERT INTO TableName 
    (`id`, `amount`, `timestamp`) 
VALUES 
    (1, 10, '2013-01-06 12:23:56'), 
    (1, 15, '2013-01-06 02:23:41'), 
    (1, 15, '2013-01-07 14:23:42'), 
    (1, 0, '2013-01-08 04:23:56'), 
    (1, 5, '2013-01-08 16:23:25'), 
    (1, 20, '2013-01-08 12:23:57'), 
    (1, 10, '2013-01-08 23:23:40'), 
    (1, 0, '2013-01-09 07:23:56'), 
    (1, 5, '2013-01-12 17:23:25'), 
    (1, 20, '2013-01-13 22:23:57'), 
    (1, 10, '2013-01-14 09:23:40'), 
    (1, 10, '2013-01-14 19:23:23'), 
    (1, 35, '2013-01-15 15:23:55'), 
    (1, 40, '2013-01-15 21:29:38'), 
    (2, 40, '2013-01-06 02:31:59'); 

而且我用它作为使用我发现各地没有太大的运气互联网的各种方法的游乐场。

任何想法如何获得该结构中的数据?

回答

1
select 
    date(timestamp) as my_date, 
    sum(amount) 
from TableName 
where id = 1 
and timestamp between <start_date> and <end_date> 
group by my_date 

between再次使用date()功能,如果你传递时间戳。

+0

嘿,谢谢你。我自己实际上已经到了这个地步,但事情是我希望每天都能显示,即使是我没有数据的显示。 所以如果你运行这个,某些日期不会显示出来。 我想我需要使用DATE_ADD(timestamp,INTERVAL 1 DAY)或类似的东西加入同一张表。 – Nick 2014-08-27 15:35:26

3

您需要生成所有日期。这是一个痛苦,但你的数据了以下工作:

select d.dte, coalesce(sum(tn.amount), 0) 
from ((select date(timestamp) as dte from tablename) union 
     (select date(timestamp) + interval 1 day from tablename) union 
     (select date(timestamp) - interval 1 day from tablename) 
    ) d left outer join 
    tablename tn 
    on date(tn.timestamp) = d.dte 
group by d.dte 
order by 1; 

编辑:

如果你想限制这些在表的日期,再加入:

where d.dte between (select min(date(timestamp) from tablename) and 
        (select max(date(timestamp) from tablename) 

如果您的差距更大,将selects放在d子查询中,或者使用日历表(后者更容易)。

Here是SQL小提琴。

+0

WORKED !!哦,哇,它看起来像一个棘手的。只要stackoverflow让我接受这个答案。 – Nick 2014-08-27 15:40:05

+0

如果差距更大,会发生什么? 有几天缺少......这个脚本只能算出-1/+ 1天...... – Nick 2014-08-29 13:22:02

+0

理想情况下,我希望每天都要从startdate开始列出,并在enddate结束。 – Nick 2014-08-29 13:32:23