2012-03-05 52 views
3

我有(每次約6個月)取得2日期間所有已完成的訂單這個簡單的查詢空行:生成即使空2日期間

select IFNULL(sum(o.amount), 0) as amount, o.completed_at 
from orders o 
where date(o.completed_at) between '2011/10/01' and '2012/03/06' 
group by year(o.completed_at), month(o.completed_at) order by o.completed_at 

但這裏的問題是,例如一月和2月,如果沒有訂單,那麼這將只返回4行而不是6行6個月。

我需要它仍然返回6行,只是爲這些缺失的日期設置爲0。

下面是一個示例輸出,僅返回5行 - 3月份失蹤,我需要它出現:http://d.pr/DEuR

+1

這可能是有幫助的:http://stackoverflow.com/a/9552735/268273 – 2012-03-06 02:23:59

回答

0

嘗試用coalesce函數會返回「0」如果sum(orders.amount)是空的特定月份:

select COALESCE(sum(o.amount), 0) as amount, o.completed_at 
from orders o 
where date(o.completed_at) between '2011/10/01' and '2012/03/06' 
group by year(o.completed_at), month(o.completed_at) order by o.completed_at 
+0

COALESCE()與OP所使用的'IFNULL()'具有相同的功能。不幸的是,它不會解決缺失行的問題。 – 2012-03-06 01:10:56

+0

如果使用case-when子句在存在空值時顯示「0」,那麼怎麼辦?這會起作用嗎? – 2012-03-06 09:26:05

0

這裏是你需要的東西:

1]創建輔助表

create table db.myDates(
    completed_at date not null 
) 

2]與有效範圍內的幾個月填充臺,例如:

insert into db.myDates values('2011-10-01'), 
('2011-11-01'), 
('2011-12-01'), 
('2012-01-01'), 
('2012-02-01'), 
('2012-03-01'); 

3]然後選擇:

select a.completed_at, sum(b.amount) 
from myDates a 
left join orders b 
    on extract(year_month from a.completed_at)=extract(year_month from b.completed_at) 
    and date(b.completed_at) between '2012-01-05' and '2012-06-05' 
group by year(b.completed_at)), month(dateCompleted) 
order by a.completed_at; 

結果如下所示(日期礦)

2012-01-01 27 
2012-02-01 NULL 
2012-03-01 47 
2012-04-01 13 
2012-05-01 12 
2012-06-01 15 
+0

它可以是臨時表嗎?或每個SQL後,我放棄表? – David 2012-03-06 13:25:11

+0

@David,表格在每個日期範圍內都會有所不同,所以臨時表似乎是一種很好的方法。 – 2012-03-06 14:15:44

+0

就表格而言,您有幾種選擇:1)它可以是臨時的; 2)它可以是永久性的,你只需每次更改範圍; 3)它可以是永久性的,並用三年的時間填滿它,所以你不必每六個月更換一次。無論您希望如何,您都可以自由保留和維護桌面。 – tribal 2012-03-06 18:58:52

0

由於許多因素,此查詢很複雜。

最簡單的解決方案可能是在每個月的第一天添加0數量。