PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Regrouper par mois, renvoyer 0 si aucun enregistrement trouvé

Le group by clause ne créera pas d'entrées où il n'y a pas de données, comme vous l'avez vu. Ce que vous pourriez faire, c'est left join ce résultat entier avec un autre jeu de résultats contenant toutes les entrées souhaitées - par exemple, celui que vous générez dynamiquement avec 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