2012-12-02 25 views
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非常非常生鏽。

+0

什麼列和什麼值定義** Active **和** Inactive **? – BellevueBob

回答

5

statusv$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; 
+0

不錯的一個。不知道爲什麼我想使用它的子查詢。 –

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 

更新基於尼古拉斯的迴應是應使用列狀態