按月份分组,包括空月
问题描述:
我想选择每个月的所有订单价值。我知道这适用于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,但现在一个月没有露面。
这可能吗?
答
完成此操作的一种方法是创建并填充满连续几个月的表格。
然后您可以使用该表格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 :) –
你能告诉我们一个实例 - 就像架构和你想要得到什么,以及你尝试过什么?你的问题还不够清楚。 –