如果在UNION查询中未找到某些日期的记录,则返回0

时间:2019-02-15 18:16:07

标签: sql oracle

我有以下查询

SELECT 
    COUNT(c.ID) as RECORD_COUNT, c.WEEK_START, c.LABEL
FROM
    (SELECT 
         a.ID, TRUNC(a.START_DATE,'IW') WEEK_START, 'YES' as LABEL 
     FROM 
         TABLE1 a
     UNION ALL
     SELECT 
         b.ID, TRUNC(b.START_DATE,'IW') WEEK_START, 'NO' as LABEL 
     FROM 
         TABLE1 b
     WHERE 
         FUNCTION(b.ID) = 'Test') AS c

我得到的是每周的记录数,在第一个子查询中带有标签YES出现的记录数,以及每周的记录数在第二个子查询中带有标签{{ 1}}。

示例:

NO

很多时候,第二个子查询不返回任何记录,因此我缺少某些日期的行。

在上面的示例中,对于RECORD_COUNT WEEK_START LABEL 100 1/28/2019 YES 24 1/28/2019 NO 81 2/4/2019 YES 229 2/11/2019 YES 6 2/11/2019 NO 的{​​{1}}行未返回任何内容。

如何修改查询以使没有数据的行返回零?

我想看到的是这样的:

NO

2 个答案:

答案 0 :(得分:0)

有更复杂的方法可以更普遍地工作。但对于您而言,这是一个简单的方法:

SELECT COUNT(c.ID) as RECORD_COUNT, c.WEEK_START, c.LABEL
FROM
(
    SELECT a.ID, 
           TRUNC(a.START_DATE,'IW') WEEK_START, 
           'YES' as LABEL 
    FROM TABLE1 a
    UNION ALL
    SELECT DECODE(FUNCTION(b.ID),'Test',b.ID,NULL) ID,
           TRUNC(b.START_DATE,'IW') WEEK_START, 
           'NO' as LABEL 
    FROM TABLE1 b
) as c

答案 1 :(得分:0)

我建议将值放入列而不是行中:

select trunc(t.START_DATE, 'IW') as WEEK_START,
       count(*) as num_yes,
       sum(case when FUNCTION(b.ID) = 'Test' then 1 else 0 end) as num_nos
from table1
group by trunc(t.START_DATE, 'IW')
order by week_start;

如果您想要单独的行,那么我将取消其显示:

with t as (
      select trunc(t.START_DATE, 'IW') as WEEK_START,
             count(*) as num_yes,
             sum(case when FUNCTION(b.ID) = 'Test' then 1 else 0 end) as num_nos
      from table1
      group by trunc(t.START_DATE, 'IW')
     )
select (case when l.label = 'YES' then t.num_yes else t.num_nos end) as record_count,
       t.week_start, l.label
from t cross join
     (select 'YES' as label from dual union all select 'NO' as label) l
order by week_start;