Группировать по месяцам, включая пустые месяцы - PullRequest
2 голосов
/ 04 ноября 2011

Я хочу выбрать все значения моего заказа в месяц.Я знаю, что это прекрасно работает с месяцем 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, но теперь месяц не отображается.

Возможно ли это?

Ответы [ 2 ]

5 голосов
/ 04 ноября 2011

Один из способов сделать это - создать и заполнить таблицу, полную месяцев подряд.

Затем вы можете 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 голосов
/ 23 мая 2018

После поиска простого решения я наконец нашел это, которое я думаю, ПРОСТО.Это покажет продажи прошлого года и этого года бок о бок.

select 
       date_format(current_date - INTERVAL 1 YEAR,'%Y') as LAST_YR,
       date_format(NOW(),'%Y') as THIS_YR,
       monthname(date) as month,
       sum(case when year(date) = date_format(current_date - INTERVAL 1 YEAR,'%Y') then amount else 0 end) as sales_ly,
       sum(case when year(date) = DATE_FORMAT(NOW(),'%Y') then amount else 0 end) as sales_ty
from tablename
where date between date_format(current_date - INTERVAL 1 YEAR,'%Y-%01-%01')
and date_format(current_date, '%Y-%12-%31')
group by monthname(date)
order by max(month(date));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...