De group by
clausule zal geen items maken waar er geen gegevens zijn, zoals je hebt gezien. Wat je zou kunnen doen is left join
dit hele resultaat met een andere resultaatset die alle gewenste items bevat - bijvoorbeeld een die u dynamisch genereert met generate_series
:
SELECT generate_series AS month_number, cnt
FROM GENERATE_SERIES(1,12) g
LEFT JOIN (SELECT COUNT(s.id) AS cnt,
DATE_PART('month', s.viewed_at) AS month_number
FROM statistics_maps_view s
INNER JOIN maps m ON s.maps_id = m.id
WHERE m.users_id = $users_id
GROUP BY month_number) s ON g.generate_series = s.month_number
ORDER BY 1 ASC