[英]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
存在。 在您的原始版本中,至少需要有一条ID
为123
记录,否则将不返回任何记录。
如何将值放在一行中?
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.