2014-04-25 30 views
2

我已經在這裏搜索計算器上類似的問題,空行,但我不明白如何使這項工作,我想要做的......MySQL的單表,選擇過去7天,包括

所以,我想從數據庫獲取最近7天的交易並獲得總銷售額,並且如果某天沒有數據,還包括空行。

我到目前爲止有: http://sqlfiddle.com/#!2/f4eda/6

此輸出:

| PURCHASE_DATE | AMOUNT | 
|---------------|--------| 
| 2014-04-25 |  19 | 
| 2014-04-24 |  38 | 
| 2014-04-22 |  19 | 
| 2014-04-19 |  19 | 

我想要什麼:

| PURCHASE_DATE | AMOUNT | 
|---------------|--------| 
| 2014-04-25 |  19 | 
| 2014-04-24 |  38 | 
| 2014-04-23 |  0 | 
| 2014-04-22 |  19 | 
| 2014-04-21 |  0 | 
| 2014-04-20 |  0 | 
| 2014-04-19 |  19 | 

任何幫助表示讚賞:)

+0

可能重複[MySQL的:選擇兩個日期之間的所有數據(http://stackoverflow.com/questions/1080207/mysql-select-all-data-between-two-dates) –

回答

2

簡單地放在一起子查詢與你想要的日期和使用left outer join

select d.thedate, coalesce(SUM(amount), 0) AS amount 
from (select date('2014-04-25') as thedate union all 
     select date('2014-04-24') union all 
     select date('2014-04-23') union all 
     select date('2014-04-22') union all 
     select date('2014-04-21') union all 
     select date('2014-04-20') union all 
     select date('2014-04-19') 
    ) d left outer join 
    transactions t 
    on t.purchase_date = d.thedate and vendor_id = 0 
GROUP BY d.thedate 
ORDER BY d.thedate DESC; 
+0

謝謝,但它提供了一些錯誤http://sqlfiddle.com/#!2/f4eda/41 異常 - >字符串(282)「SQLSTATE [42000]:語法錯誤或訪問衝突:1064您的SQL語法錯誤;檢查與您的MySQL服務器版本相對應的手冊,以便在'union all select date('2014-04-23'union all select date'at line 3' – plexcell

11

這並不容易。我從這個線程generate days from date range接受了幫助,並將其與您的查詢結合起來。

所以我們的想法是獲得最近7天的日期列表,然後將靜態數量爲0的這些日期加入到您的查詢中,然後總結它們。這可以被用於任何日期範圍,只需要改變他們在這兩個查詢

select 
t1.purchase_date, 
coalesce(SUM(t1.amount+t2.amount), 0) AS amount 
from 
(
    select DATE_FORMAT(a.Date,'%Y-%m-%d') as purchase_date, 
    '0' as amount 
    from (
    select curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY as Date 
    from (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as a 
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as b 
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as c 
) a 
    where a.Date BETWEEN NOW() - INTERVAL 7 DAY AND NOW() 
)t1 
left join 
(
    SELECT DATE_FORMAT(purchase_date, '%Y-%m-%d') as purchase_date, 
    coalesce(SUM(amount), 0) AS amount 
    FROM transactions 
    WHERE purchase_date BETWEEN NOW() - INTERVAL 7 DAY AND NOW() 
    AND vendor_id = 0 
    GROUP BY purchase_date 
)t2 
on t2.purchase_date = t1.purchase_date 
group by t1.purchase_date 
order by t1.purchase_date desc 

DEMO

+0

')附近使用正確的語法,這應該是被接受的答案...非常不錯,它的動態也是如此,所以你不必在日期中硬編碼。 –

0

這是過去7天;

select d.thedate, coalesce(SUM(amount), 0) AS amount 
from (select DATE(NOW()) as thedate union all 
     select DATE(DATE_SUB(NOW(), INTERVAL 1 DAY)) union all 
     select DATE(DATE_SUB(NOW(), INTERVAL 2 DAY)) union all 
     select DATE(DATE_SUB(NOW(), INTERVAL 3 DAY)) union all 
     select DATE(DATE_SUB(NOW(), INTERVAL 4 DAY)) union all 
     select DATE(DATE_SUB(NOW(), INTERVAL 5 DAY)) union all 
     select DATE(DATE_SUB(NOW(), INTERVAL 6 DAY))) d left outer join 
    transactions t 
    on t.purchase_date = d.thedate and vendor_id = 0 
GROUP BY d.thedate 
ORDER BY d.thedate DESC;