[英]oracle sql - replace value
select name,count(case),starttime, endtime
from employee
where team in ('dba','spt','sd') and name in
(('dba1','db2','db3','spt1','spt2','sd1','sd2')
and starttime between sysdate - 3 and sysdate ;
当我运行此查询时,我低于 output,其中用户 spt1 在过去三天没有任何数据,因此它不会出现在结果中
dba1 12 23 42
dba2 14 12 15
dba3 23 11 23
spt2 53 23 43
sd1 40 34 23
sd2 98 34 23
但我需要得到如下结果
dba1 12 23 42
dba2 14 12 15
dba3 23 11 23
spt1 - - -
spt2 53 23 43
sd1 40 34 23
sd2 98 34 23
有什么方法可以得到这个结果吗?
您可以使用以下查询实现相同的目的
WITH data AS
(
SELECT name,
count(
CASE),
starttime,
endtime
FROM employee
WHERE team IN ('dba',
'spt',
'sd')
AND name IN ('dba1',
'db2',
'db3',
'spt1',
'spt2',
'sd1',
'sd2')
AND starttime BETWEEN SYSDATE - 3 AND SYSDATE
GROUP BY name,
starttime,
endtime)
SELECT *
FROM data
UNION ALL
SELECT name,
'-',
'-',
'-'
FROM employee em
WHERE NOT EXISTS
(
SELECT 1
FROM data dt
WHERE dt.name=em.name)
使用left join
:
select n.name, count(e.case), e.starttime, e.endtime
from (select 'dba1' as name from dual union all
select 'db2' from dual union all
select 'db3' from dual union all
select 'spt1' from dual union all
select 'spt2' from dual union all
select 'sd1' from dual union all
select 'sd2' from dual
) n left join
employee e
on e.name = t.name and
e.team in ('dba','spt','sd') and
e.starttime between sysdate - 3 and sysdate
group by n.name, e.starttime, e.endtime ;
注意:这会将缺失值返回为NULL
而不是'-'
。 NULL
绝对是 SQL 中更典型的方法。 您可以将值转换为字符串,但我建议坚持使用NULL
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.