PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Nach Monat gruppieren, 0 zurückgeben, wenn kein Datensatz gefunden wird

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