首页 > 解决方案 > 当oracle中特定周不存在数据时如何将值填充为零

问题描述

我有一个具有以下结构的表。

Note_title varchar2(100)
Note_created_on date

现在在报告中,我想显示每周创建的所有笔记,因此我为它实施了以下解决方案。

SELECT to_char(Note_created_on - 7/24,'ww')||'/'||to_char(Note_created_on - 7/24,'yyyy') as Week ,
nvl(COUNT(Note_title),'0') as AMOUNT
FROM Notes
GROUP BY to_char(Note_created_on - 7/24,'ww') ,
to_char(Note_created_on -7/24,'yyyy')
ORDER BY to_char(Note_created_on - 7/24,'ww') DESC

而且我从中得到了正确的输出,但是假设第 42,45 周没有任何已创建的注释,那么它只是缺少它。样本输出:

WEEK    AMOUNT
46/2018 3
44/2018 22
43/2018 45
41/2018 1
40/2018 2
39/2018 27
38/2018 23

那么我怎样才能获得第 42,45 周的零值而不是将它们排除在外呢?

标签: sqloracleplsql

解决方案


首先,您需要生成每年之间的所有周数,然后在周数上与 Notes 表连接,并按生成的周数分组。例如:

 with weeks
        as ( select level as lvl /*Assume 52 weeks in a calendar year..*/
               from dual 
             connect by level <=52
            )
     ,weeks_year
       as (select distinct 
                  b.lvl||'/'||trunc(Note_created_on,'YYYY') as week_year_val /*From the start of year in Note_created_on*/
            from Notes a
            join weeks b
               on 1=1      
           )
  SELECT a.week_year_val as Week 
         ,COUNT(Note_title) as AMOUNT
     FROM weeks_year a
LEFT JOIN Notes b
       ON a.week_year_val=to_char(b.Note_created_on - 7/24,'ww')||'/'||to_char(b.Note_created_on - 7/24,'yyyy')
GROUP BY a.week_year_val
ORDER BY a.week_year_val DESC

推荐阅读