Oracle SQL: 没有项目时不显示行

Oracle SQL: Rows don't display when there are no items

我为 Oracle 数据库编写了一个脚本,它使用多种技术记录事件。一个事件通常会被记录两次,一次是进入技术领域,一次是退出技术领域。

我想做的是展示我数据库中的每一项技术。 我想从每项技术中显示目前有多少项以及最旧项的年龄。

我的 table 应该是什么样子的图形示例:

我用下面的代码来计算这些东西

select dm1.technology,
       count(dm1.id) as "current_number_of_items",
       TO_CHAR(MAX(TO_DATE('20000101','yyyymmdd')+(SYSDATE - dm1.time_event)),
       'hh24:mi:ss') as "age_of_oldest_item"
from dm_procmon dm1
where (select count(dm2.id) from dm_procmon dm2 where dm1.id= dm2.id) = 1
group by dm1.technology;

为了计算当前项目数,我只计算 ID 并按技术对它们进行分组。为了计算最旧项目的年龄,我检查一个 id 是否只在数据库中出现 1 次(否则它已经不存在了)。比我只取最老的年龄(SYS - 来自日志的时间事件)。

这很完美,但当科技中的项目为 0 时就不行了。如果其中没有项目,我仍然想显示技术名称。我该怎么做?

我是这样理解你的:如果项目相同的 ID 在 table 中出现两次(或更多)那么它不应该被分析, 但是即使不存在仅出现一次的项目,您也希望列出该技术。此查询应执行此操作:

with items as (
  select id, technology, count(1) cnt, max(time_event) tev  
    from dm_procmon group by id, technology )
select technology, sum(decode(cnt, 1, 1, 0)) as "current_number_of_items",
    TO_CHAR(MAX(TO_DATE('20000101','yyyymmdd')
      +(SYSDATE - decode(cnt, 1, tev))), 'hh24:mi:ss') as "age_of_oldest_item"
  from items group by technology order by technology

子查询 items 计算每个项目的出现次数。主查询列出所有技术并添加信息 对于 count=1 的项目(函数 decode() 执行此操作)。

示例结果:

TECHNOLOGY             current_number_of_items age_of_oldest_item
---------------------- ----------------------- ------------------
Folder Belfius                               1 00:36:35
Folder KBC                                   0 
Queue KBC                                    1 00:36:35
Repository Accepted                          1 00:36:35
Repository Enriched                          1 00:36:35
Repository Sent                              2 00:36:35