Oracle 如何按月分组,包括所有月份?

Oracle 如何按月分组,包括所有月份?,oracle,group-by,calendar,date-arithmetic,Oracle,Group By,Calendar,Date Arithmetic,我把我的桌子按月份分组 SELECT TO_CHAR (created, 'YYYY-MM') AS operation, COUNT (id) FROM user_info WHERE created IS NOT NULL GROUP BY ROLLUP (TO_CHAR (created, 'YYYY-MM')) 2015-04 1 2015-06 10 2015-08 22 2015-09 8 2015-10 13 2015-12 5 2016-01 25 2016-

我把我的桌子按月份分组

  SELECT TO_CHAR (created, 'YYYY-MM') AS operation, COUNT (id)
    FROM user_info
   WHERE created IS NOT NULL
GROUP BY ROLLUP (TO_CHAR (created, 'YYYY-MM'))

2015-04 1
2015-06 10
2015-08 22
2015-09 8
2015-10 13
2015-12 5
2016-01 25
2016-02 37
2016-03 24
2016-04 1
2016-05 1
2016-06 2
2016-08 2
2016-09 7
2016-10 103
2016-11 5
2016-12 2
2017-04 14
2017-05 2
        284
但是这些记录并没有涵盖所有的月份。 我希望输出包括所有月份,在输出中以默认值显示缺少的月份:

2017-01 ...
2017-02 ...
2017-03 ZERO
2017-04 ZERO
2017-05 ...
甲骨文有。解决这个问题的两个相关问题是

月\计算两个日期之间的月数 添加\个月,将日期增加给定的月数 我们可以将这些函数组合起来,生成一个包含表记录所跨越的所有月份的表。然后,我们使用外部联接将记录从用户信息有条件地联接到该日历。当没有记录匹配时,countid将为零

with cte as (
  select max(trunc(created, 'MM')) as max_dt
         , min(trunc(created, 'MM')) as min_dt
  from user_info
  )
 , cal as (
    select add_months(min_dt, (level-1)) as mth
    from cte
    connect by level <= months_between(max_dt, min_dt) + 1
)
select to_char(cal.mth, 'YYYY-MM') as operation
       , count(id)
from  cal
     left outer join user_info
   on trunc(user_info.created, 'mm') = cal.mth
group by rollup (cal.mth)
order by 1
/
搜索日历表,有很多这样的问题。您可以在我去年发布的文章中找到灵感,它是针对Access的,但原则对于所有RDBMS都是一样的。请使用有效的sql显示,包括WHERE子句等。