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

时间:2015-03-31 09:04:06

标签: sql oracle select rows

我为Oracle数据库编写了一个脚本,该脚本使用多种技术记录事件。事件通常记录两次,一次是在技术进入时,有一次是在技术发布时。

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

我的表格应如何显示的图形示例: Snippet of how the table should look like

我使用以下代码来计算这些东西

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是否只在数据库中出现一次(否则它已经出来)。我只是采取最大的年龄(SYS - 来自日志的时间事件)。

这种方法很完美,但在技术中有0项时则不然。如果没有项目,我还想显示技术名称。我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

我这样理解你:如果项目中相同的ID出现在表格中两次(或更多),则不应对其进行分析, 但即使不存在只出现一次的项目,您也希望列出此技术。此查询应执行此操作:

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