2014-08-27 51 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