group by
klauzule nevytvoří položky, kde nejsou žádná data, jak jste viděli. Co můžete udělat, je left join
celý tento výsledek s jinou sadou výsledků, která obsahuje všechny požadované položky – např. takovou, kterou dynamicky vygenerujete pomocí 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