按月分组,包括空月

Leo*_*een 2 mysql group-by

我想每月选择所有订单价值.我知道这对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)
Run Code Online (Sandbox Code Playgroud)

因此,当一个月的结果为0时,我希望看到值为0的月份,但现在月份没有出现.

这可能吗?

Tom*_*Mac 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;
Run Code Online (Sandbox Code Playgroud)

PS不确定你是否有任何反对Oudejaarsavond但12月有31天;-)