2017-10-16 47 views
-2

嗨我加入一个表格,范围为1个月天,以获取基于连接表(基表)的每天计数。通过范围表加入PLSQL组正在显示适当的计数

为此,我使用左外连接来计算每天的计数。 在我的基表如下所示(表名REGISTRIERUNG]

enter image description here

而且我已创建一个月范围内使用下面的查询

SELECT TO_DATE ('01-10-2017', 'dd-mm-yyyy') + ROWNUM - 1 AS daterange 
    FROM all_objects 
WHERE ROWNUM <= 
      TO_DATE ('30-10-2017', 'dd-mm-yyyy') 
      - TO_DATE ('01-10-2017', 'dd-mm-yyyy') 
      + 1; 

enter image description here

,但我得到的计数1日期现在有记录匹配范围表 而不是0计数。

我正在使用下面的查询来获得最终结果。

SELECT TRUNC (a.daterange), COUNT (a.daterange) 
    FROM (SELECT TO_DATE ('01-10-2017', 'dd-mm-yyyy') + ROWNUM - 1 
         AS daterange 
       FROM all_objects 
       WHERE ROWNUM <= 
         TO_DATE ('30-10-2017', 'dd-mm-yyyy') 
         - TO_DATE ('01-10-2017', 'dd-mm-yyyy') 
         + 1) a 
     LEFT OUTER JOIN 
      REGISTRIERUNG b 
     ON TRUNC (a.daterange) = TRUNC (b.MODIFIKATIONZEIT) 
GROUP BY TRUNC (a.daterange) 
ORDER BY TRUNC (a.daterange) ASC; 

enter image description here

回答

0

你不应该基于该是列数行总是填充(查询a.daterange总是被填充,因为从你的内嵌视图此列的所有日期在一个月内) 。相反,您应该计算外部连接到带有生成日期的内联视图的表中的行数。请注意,count函数将不会考虑列modifikationzeit中具有null值的行。

例如:

select a.daterange, 
     count(b.modifikationzeit) 
    from (select to_date('01-10-2017', 'dd-mm-yyyy') + level - 1 as daterange 
      from dual 
     connect by level <= to_date('31-10-2017', 'dd-mm-yyyy') - 
          to_date('01-10-2017', 'dd-mm-yyyy') + 1) a 
    left outer join registrierung b 
    on a.daterange = trunc(b.modifikationzeit) 
group by a.daterange 
order by a.daterange; 

我已删除不必要trunc's,并转换从查询到all_objects使用connect by子句之一。我还确定了十月份的日期生成 - 它有31天,而不是你的例子中的30天。

+0

Thnaks很多工作 – user432843