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
我为 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