在postgres中的generate_series上加入计数查询,并将Null值检索为"0"

zeh*_*ron 10 sql postgresql join postgresql-9.1 generate-series

我想是从generate_series,每个月的统计和计数的ID在每月的总和.这个SQL适用于PostgreSQL 9.1:

  SELECT (to_char(serie,'yyyy-mm')) AS year, sum(amount)::int AS eintraege FROM (
    SELECT  
       COUNT(mytable.id) as amount,   
       generate_series::date as serie   
       FROM mytable  

    RIGHT JOIN generate_series(  

       (SELECT min(date_from) FROM mytable)::date,   
       (SELECT max(date_from) FROM mytable)::date,  
       interval '1 day') ON generate_series = date(date_from)  
       WHERE version = 1   
       GROUP BY generate_series       
       ) AS foo  
  GROUP BY Year   
  ORDER BY Year ASC;  
Run Code Online (Sandbox Code Playgroud)

这是我的输出

"2006-12" | 4  
"2007-02" | 1  
"2007-03" | 1  
Run Code Online (Sandbox Code Playgroud)

但我想得到的是这个输出(1月份的"0"值):

"2006-12" | 4  
"2007-01" | 0  
"2007-02" | 1  
"2007-03" | 1  
Run Code Online (Sandbox Code Playgroud)

因此,如果有一个月没有id,那么它应该被列出.任何想法如何解决这个问题?

以下是一些示例数据:

drop table if exists mytable;
create table mytable(id bigint, version smallint, date_from timestamp without time zone);
insert into mytable(id, version, date_from) values

('4084036', '1', '2006-12-22 22:46:35'),
('4084938', '1', '2006-12-23 16:19:13'),
('4084938', '2', '2006-12-23 16:20:23'),
('4084939', '1', '2006-12-23 16:29:14'),
('4084954', '1', '2006-12-23 16:28:28'),
('4250653', '1', '2007-02-12 21:58:53'),
('4250657', '1', '2007-03-12 21:58:53')
;
Run Code Online (Sandbox Code Playgroud)

Erw*_*ter 21

解开,简化和修复,它可能看起来像这样:

SELECT to_char(s.tag,'yyyy-mm') AS monat
     , count(t.id) AS eintraege
FROM  (
   SELECT generate_series(min(date_from)::date
                        , max(date_from)::date
                        , interval '1 day'
          )::date AS tag
   FROM   mytable t
   ) s
LEFT   JOIN mytable t ON t.date_from::date = s.tag AND t.version = 1   
GROUP  BY 1
ORDER  BY 1;
Run Code Online (Sandbox Code Playgroud)

db <> 在这里小提琴

在所有噪音,误导性标识符和非常规格式中,实际问题隐藏在此处:

WHERE version = 1
Run Code Online (Sandbox Code Playgroud)

当你正确使用时RIGHT [OUTER] JOIN,你通过添加一个WHERE需要不同值的子句mytable- 将有效值转换为有效值- RIGHT JOIN来消除这种努力JOIN.

将该条款拉入JOIN条件以使其工作.

我简化了其他一些事情.

有关: