繁体   English   中英

db2联合,如果为null,则返回零

[英]db2 union, return zero if null

此联合查询工作完美,但是在某些情况下,这三个条件之一没有记录。

我要做的就是使它至少在找不到记录的情况下至少返回值“ 0”。

换句话说,如果没有找到PRIOR,则返回

123 | Current | 1
123 | Full    | 2

我会得到

123 | PRIOR   | 0
123 | Current | 1
123 | Full    | 2

查询:

select ID, 'PRIOR' as Range, count(*) as count
    from table1
where ID = 123
AND date between '2017-01-01' and '2017-04-13'
group by ID
union all
select ID, 'CURRENT' as Range, count(*) as count
    from table1
where ID = 123
AND date between '2018-01-01' and '2018-04-13'
group by ID
union ALL
select ID, 'FULL' as Range, count(*) as count
    from table1
where ID = 123
AND date between '2017-01-01' and '2017-12-31'
group by ID;

您可以重新定义查询以使用不带WHERE子句的条件聚合:

SELECT
    ID, 'PRIOR' AS Range,
    COUNT(CASE WHEN date BETWEEN '2017-01-01' AND '2017-04-13' AND ID = 123
               THEN 1 END) AS count
FROM table1
UNION ALL
SELECT
    ID, 'CURRENT' AS Range,
    COUNT(CASE WHEN date BETWEEN '2018-01-01' AND '2018-04-13' AND ID = 123
               THEN 1 END) AS count
FROM table1
UNION ALL
SELECT
    ID, 'FULL' AS Range,
    COUNT(CASE WHEN date BETWEEN '2017-01-01' AND '2017-12-31' AND ID = 123
               THEN 1 END) AS count
FROM table1;

上面的版本应该解决您的问题的原因是,它保证了联合中的每个子查询都会生成计数报告,因为每个子查询都覆盖了整个表。 现在唯一的要求是table1存在。 在您的原始版本中,至少需要有一条ID123记录,否则将不返回任何记录。

如何将值放在一行中?

select ID,
       sum(case when date between '2017-01-01' and '2017-04-13' then 1 else 0 end) as prior,
       sum(case when date between '2018-01-01' and '2018-04-13' then 1 else 0 end) as current,
       sum(case when date between '2017-01-01' and '2017-12-31' then 1 else 0 end) as full
from table1
where ID = 123
group by ID;

就个人而言,我会发现单行中的数据更易于使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM