繁体   English   中英

oracle sql - 替换值

[英]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.

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