按月分组,如果未找到记录则返回0

时间:2015-08-29 08:57:00

标签: sql postgresql select

我想在过去12个月内从数据库表中获取记录。这是我到目前为止所尝试的内容。

SELECT COUNT(s.id), date_part('month', s.viewed_at) month_number
    FROM statistics_maps_view as s
    INNER JOIN maps as m
    ON s.maps_id=m.id Where m.users_id = $users_id group by month_number ORDER BY month_number DESC LIMIT 12

我知道它会按月分组记录。但如果某个月没有记录,有没有办法添加Count = 0

1 个答案:

答案 0 :(得分:3)

如您所见,group by子句不会创建没有数据的条目。你可以做的是left join这整个结果与另一个包含你想要的所有条目的结果集 - 例如,你用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