查询有效&基于机器和用户名的非活动连接

时间:2012-12-02 19:29:32

标签: sql oracle plsql oracle10g

我正在尝试查询列出Active,Inactive&每台计算机的连接总数,每个用户名在Oracle 10g数据库中。

我有以下查询:

SELECT count(1) AS con_count, machine, username 
FROM v$session 
WHERE type <> 'BACKGROUND'
GROUP BY username, machine 
ORDER BY con_count DESC;

这将列出每个用户每台计算机的总连接数的计数,但我无法调整它以计算活动,非活动和&amp;作为一个查询的全部连接。

所以结果应该是这样的:

ACTIVE   INACTIVE   TOTAL   MACHINE   USERNAME

我可以让查询执行前三列之一,但不能同时执行所有三列。

任何帮助都会受到赞赏,因为我的SQL非常非常生疏。

2 个答案:

答案 0 :(得分:6)

status视图的列v$session包含有关活动和非活动会话的信息。所以您可以按如下方式重新编码查询:

SELECT s.machine
     , s.username 
     , count(decode(s.STATUS, 'ACTIVE', 1))   as active_con
     , count(decode(s.STATUS, 'INACTIVE', 1)) as inactive_con
     , count(*)                               as total_con
FROM v$session s
WHERE type <> 'BACKGROUND'
GROUP BY username, machine 
ORDER BY total_con DESC;

答案 1 :(得分:1)

假设列类型可用于区分您的状态,您可以使用SUM表达式:

 select sum(case when status = 'ACTIVE' then 1 else 0 end) as ACTIVE_COUNT
      , sum(case when status = 'INACTIVE' then 1 else 0 end) as INACTIVE_COUNT
      , count(*) as TOTAL_COUNT
      , username, machine
 from   v$session
 where type <> 'BACKGROUND'
 group by username, machine
 order by username, machine

根据Nicholas的回复更新了应该使用状态列。