Here is a solution will a complete demo:
SELECT T2.month_day,
IF (SUM(TotalApps * (YEAR(start) = '2016')) = 0, '', SUM(TotalApps * (YEAR(start) = '2016'))) as `2016`,
IF (SUM(TotalApps * (YEAR(start) = '2015')) = 0, '', SUM(TotalApps * (YEAR(start) = '2015'))) as `2015`,
IF (SUM(TotalApps * (YEAR(start) = '2014')) = 0, '', SUM(TotalApps * (YEAR(start) = '2014'))) as `2014`,
IF (SUM(TotalApps * (YEAR(start) = '2013')) = 0, '', SUM(TotalApps * (YEAR(start) = '2013'))) as `2013`
FROM
( SELECT
start, month_day,
IF(@last_year = YEAR(start),
@total := @total + T.id,
@total := T.id) AS TotalApps,
@last_year := YEAR(start)
FROM (SELECT start,COUNT(*) AS id, DATE_FORMAT(start, '%m/%e') as month_day
FROM application
GROUP BY start
ORDER BY start) AS T, (SELECT @total:=0, @last_year := NULL) AS n
) as T2
GROUP BY month_day;
Here is a demo:
SQL:
-- data
create table application(start date);
insert into application values
('2016-01-01'),('2016-01-02'),('2016-01-02'),('2016-01-03'),
('2014-01-01'),('2014-01-02'),('2014-01-04'),
('2015-01-01'),('2015-01-02'),('2015-01-05');
select * from application;
-- query wanted
SELECT T2.month_day,
IF (SUM(TotalApps * (YEAR(start) = '2016')) = 0, '', SUM(TotalApps * (YEAR(start) = '2016'))) as `2016`,
IF (SUM(TotalApps * (YEAR(start) = '2015')) = 0, '', SUM(TotalApps * (YEAR(start) = '2015'))) as `2015`,
IF (SUM(TotalApps * (YEAR(start) = '2014')) = 0, '', SUM(TotalApps * (YEAR(start) = '2014'))) as `2014`,
IF (SUM(TotalApps * (YEAR(start) = '2013')) = 0, '', SUM(TotalApps * (YEAR(start) = '2013'))) as `2013`
FROM
( SELECT
start, month_day,
IF(@last_year = YEAR(start),
@total := @total + T.id,
@total := T.id) AS TotalApps,
@last_year := YEAR(start)
FROM (SELECT start,COUNT(*) AS id, DATE_FORMAT(start, '%m/%e') as month_day
FROM application
GROUP BY start
ORDER BY start) AS T, (SELECT @total:=0, @last_year := NULL) AS n
) as T2
GROUP BY month_day
;
Output:
mysql> select * from application;
+------------+
| start |
+------------+
| 2016-01-01 |
| 2016-01-02 |
| 2016-01-02 |
| 2016-01-03 |
| 2014-01-01 |
| 2014-01-02 |
| 2014-01-04 |
| 2015-01-01 |
| 2015-01-02 |
| 2015-01-05 |
+------------+
10 rows in set (0.00 sec)
mysql> -- query wanted
mysql> SELECT T2.month_day,
-> IF (SUM(TotalApps * (YEAR(start) = '2016')) = 0, '', SUM(TotalApps * (YEAR(start) = '2016'))) as `2016`,
-> IF (SUM(TotalApps * (YEAR(start) = '2015')) = 0, '', SUM(TotalApps * (YEAR(start) = '2015'))) as `2015`,
-> IF (SUM(TotalApps * (YEAR(start) = '2014')) = 0, '', SUM(TotalApps * (YEAR(start) = '2014'))) as `2014`,
-> IF (SUM(TotalApps * (YEAR(start) = '2013')) = 0, '', SUM(TotalApps * (YEAR(start) = '2013'))) as `2013`
-> FROM
-> ( SELECT
-> start, month_day,
-> IF(@last_year = YEAR(start),
-> @total := @total + T.id,
-> @total := T.id) AS TotalApps,
-> @last_year := YEAR(start)
-> FROM (SELECT start,COUNT(*) AS id, DATE_FORMAT(start, '%m/%e') as month_day
-> FROM application
-> GROUP BY start
-> ORDER BY start) AS T, (SELECT @total:=0, @last_year := NULL) AS n
-> ) as T2
-> GROUP BY month_day
-> ;
+-----------+------+------+------+------+
| month_day | 2016 | 2015 | 2014 | 2013 |
+-----------+------+------+------+------+
| 01/1 | 1 | 1 | 1 | |
| 01/2 | 3 | 2 | 2 | |
| 01/3 | 4 | | | |
| 01/4 | | | 3 | |
| 01/5 | | 3 | | |
+-----------+------+------+------+------+
5 rows in set (0.00 sec)