2011-11-04 84 views
2

我想選擇每個月的所有訂單價值。我知道這適用於GROUP BY月份,但只有在有訂單的月份。現在我也想要沒有訂單的月份,所以我得到所有的月份。按月份分組,包括空月

這是我的查詢:

SELECT SUM(VerkoopfactBedrag) AS bedrag, DATE_FORMAT(VerkoopfactDatum,'%M') AS date 
FROM verkoopfacturen 
WHERE Verkoopfact_UserId = 12 
    AND VerkoopfactDatum BETWEEN '2011-01-01' AND '2011-12-30' 
GROUP BY MONTH(VerkoopfactDatum) 

所以當了一個月的結果是0我想看到的月份值爲0,但現在一個月沒有露面。

這可能嗎?

+0

你能告訴我們一個實例 - 就像架構和你想要得到什麼,以及你嘗試過什麼?你的問題還不夠清楚。 –

回答

5

完成此操作的一種方法是創建並填充滿連續幾個月的表格。

然後您可以使用該表格OUTER JOIN

因此,像:

drop table if exists all_months; 

create table all_months (a_month_id int unsigned PRIMARY KEY,a_month varchar(20) NOT NULL, UNIQUE KEY `all_months_uidx1` (a_month)); 

insert into all_months values (1,'January'); 
insert into all_months values (2,'February'); 
insert into all_months values (3,'March'); 
insert into all_months values (4,'April'); 
insert into all_months values (5,'May'); 
insert into all_months values (6,'June'); 
insert into all_months values (7,'July'); 
insert into all_months values (8,'August'); 
insert into all_months values (9,'September'); 
insert into all_months values (10,'October'); 
insert into all_months values (11,'November'); 
insert into all_months values (12,'December'); 

SELECT SUM(IFNULL(t1.VerkoopfactBedrag,0)) AS bedrag, 
am.a_month AS date 
from 
(
select 
ifnull(vn.VerkoopfactBedrag,0) as VerkoopfactBedrag, 
cast(DATE_FORMAT(VerkoopfactDatum, '%M') as char) as mdate 
FROM verkoopfacturen vn 
WHERE Verkoopfact_UserId = 12 
AND VerkoopfactDatum BETWEEN '2011-01-01' AND '2011-12-31' 
GROUP BY DATE_FORMAT(VerkoopfactDatum, '%M') 
) t1 RIGHT OUTER JOIN all_months am on t1.mdate = am.a_month 
group by am.a_month 
order by a_month_id asc; 

PS不知道如果有一個針對Oudejaarsavond什麼,但有31天;-)月

+0

謝謝湯姆,這是我需要的,沒有問題與Oudejaarsavond :) –