首页 > 解决方案 > 如果在 UNION 查询中未找到某些日期的记录,则返回 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 
         b.ID, TRUNC(b.START_DATE,'IW') WEEK_START, 'NO' as LABEL 
     FROM 
         TABLE1 b
     WHERE 
         FUNCTION(b.ID) = 'Test') AS c

我得到的是每周的记录数,出现在第一个子查询中带有标签YES的记录数,以及每周出现在带有标签的第二个子查询中的记录数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

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

在上面的示例中,它没有为 for 的行返回任何NO内容2/4/2019

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

我想看到的是这样的:

RECORD_COUNT   WEEK_START   LABEL
    100          1/28/2019  YES
     24          1/28/2019  NO
     81          2/4/2019   YES
      0          2/4/2019   NO
    229          2/11/2019  YES
      6          2/11/2019  NO

标签: sqloracle

解决方案


有更复杂的方法可以更普遍地工作。但是对于您的情况,一种简单的方法是:

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

推荐阅读