如果count为null,则oracle sql返回0

时间:2016-12-09 04:09:25

标签: sql oracle

我有两个表TT_RESULT_SUMMARY_TAB是父表,TT_RESULT_DETAIL_TAB是子表。 {strong 1}的{strong>主键'UTC_END_TIME'是TT_RESULT_SUMMARY_TAB外键。 只有当某一天有错误时,才会将错误信息插入TT_RESULT_DETAIL_TAB。即使没有发现错误,相关信息也会每天插入父表TT_RESULT_DETAIL_TAB,尽管TT_RESULT_SUMMARY_TAB 1}}当天没有错误信息。

我正在尝试的是弄清楚父表TT_RESULT_DETAIL_TAB

中所有日期的错误总数

说2016/11/30总共有1000个错误 和2016/12/01共有零错误

TT_RESULT_SUMMARY_TAB

这是我在oracle开发人员上尝试的内容

+----------------------+------------+
|total_number_of_errors| GivenDay   |
+----------------------+------------+
|        1000          | 2016/11/30 |        
|           0          | 2016/12/01 |
+----------------------+------------+

但我没有关于2016/12/01的信息说0。

1 个答案:

答案 0 :(得分:0)

您正在寻找“分区外连接”(在Google上查找)。 https://docs.oracle.com/cd/E11882_01/server.112/e25555/tdpdw_sql.htm#TDPDW007

您需要构建一个表,视图或子查询,其中包含感兴趣区间的所有单独日期。然后对现有查询执行OUTER连接,并使用coalesce(total_number_of_values, 0)获取0而不是null,以查找错误表中不存在的日期。

例如:

select nvl(t.total_number_of_errors, 0) as total_number_of_errors, d.dt as givenday
from   your_query t right outer join
       ( select to_date('2016/11/30', 'yyyy/mm/dd' dt from dual union all
         select to_date('2016/12/01', 'yyyy/mm/dd' from dual
       ) d
        on t.error_date = d.dt;

有更有效的方法来构建“间隔中的所有日期”子查询(使用CONECT BY LEVEL <= ...) - 不在此处覆盖它,因为它实际上是一个单独的问题。