Die group by
-Klausel erstellt keine Einträge, wo keine Daten vorhanden sind, wie Sie gesehen haben. Was Sie tun könnten, ist left join
dieses gesamte Ergebnis mit einem anderen Ergebnissatz, der alle gewünschten Einträge enthält - z. B. einen, den Sie dynamisch mit 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