1

我正在尝试进行查询,列出 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;

这将列出每个用户名每台机器的总连接数,但在调整它以将活动、非活动和总连接计数作为一个查询时遇到了麻烦。

所以结果应该是这样的:

ACTIVE   INACTIVE   TOTAL   MACHINE   USERNAME

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

任何帮助将不胜感激,因为我的 SQL 非常非常生疏。

4

2 回答 2

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;
于 2012-12-02T19:40:53.397 回答
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应使用列状态的响应进行了更新。

于 2012-12-02T19:41:57.707 回答