Recomiendo grouping sets
:
select coalesce(location, 'Total') as location,
coalesce(home_team_name, 'Total') as home_team_name,
sum(case when match_date >= date '2018-01-01' and
match_date < date '2018-02-01'
then 1 else 0
end) as january_2018,
sum(case when match_date >= date '2018-02-01' and
match_date < date '2018-03-01'
then 1 else 0
end) as february_2018,
sum(case when match_date >= date '2018-03-01' and
match_date < date '2018-04-01'
then 1 else 0
end) as march_2018,
sum(case when match_date >= date '2018-01-01' and
match_date < date '2019-01-01'
then 1 else 0
end) as total_2018
from match_results
group by grouping sets ( (location, home_team_name), () );
Es decir, no es necesario repetir la consulta. También cambié las comparaciones de fechas para usar fechas reales. Encuentro esto más legible y fácil de mantener que extraer partes de fechas.