2013-07-22 47 views
0

我有這個疑問,我都數不過來多個字段多計數

select 
distinct(custsegment), 
(select count(distinct clid) from call_log where enteredon = '16-JUL-13') as  UniqCalls, 
(select count(disconnectflag) from call_log where disconnectflag='IVR' and enteredon =  '16-JUL-13') as IvrCalls, 
(select count(callerid) from call_log where enteredon = '16-JUL-13') as TotalCalls 
from call_log 
where enteredon = '16-JUL-13' 

輸出是

CUSTSEGMENT UNIQCALLS IVRCALLS TOTALCALLS 
------------ ---------- ---------- ---------- 
PRIORITY    12   6   12 
NORMAL    12   6   12 

但出現問題就像我得到了優先級和師範相同的值CUSTSEGMENT,我也不確定這是否是正確的計算方法。請建議。

+0

你distinct'表明,你認爲它適用於關鍵字'的'定位僅custsegment',但這種情況並非如此。它只是不重複結果集中的記錄,比較所有列。 – GolezTrol

+0

@GolezTrol:這是做這件事的正確方式還是其他方法?我通常使用MSSQL,在Oracle上度過難關...... –

+0

同樣適用於MSSQL或任何數據庫。查詢本身並不是錯誤的,但是您的縮進和括號的使用表明您誤解了「distinct」關鍵字。 – GolezTrol

回答

3

我想你的意思是group by custsegment。這也使得你的查詢更簡單一些,因爲你不需要子查詢。

select 
    custsegment, 
    count(distinct clid) as UniqCalls, 
    count(case when disconnectflag = 'IVR' then 1 else null end) as IvrCalls, 
    -- sum(case when disconnectflag = 'IVR' then 1 else 0 end) as IvrCalls, 
    count('x') as TotalCalls 
from call_log 
where enteredon = '16-JUL-13' 
group by 
    custsegment 

計數IvrCalls,你可以在一對夫婦的方式做到這一點。 Count統計所有非空值,所以你可以使用這種情況(你甚至可以忽略else null)。或者您可以使用sum,這也是常用的。

+1

這實際上並不能解決問題,因爲子查詢與主查詢無關。 –

+0

好點。我會盡力解決這個問題。 – GolezTrol

+0

通過給我與之前相同的輸出來編組。 –

1

你的三個子查詢

select count(distinct clid) from call_log where enteredon = '16-JUL-13') 
select count(disconnectflag) from call_log where disconnectflag='IVR' and enteredon =  '16-JUL-13' 
select count(callerid) from call_log where enteredon = '16-JUL-13') 

是完全執行,因爲他們寫的,在結果集中的每一行。這就是爲什麼你會看到相同的值重複。

由於您想將多個字段組合在一起,而這些字段沒有相互排斥的結果,所以我會說,(這可能不是最好的方式)爲您感興趣的每個項目分組,然後結合你的結果。

+0

我該如何糾正? –

1

試試這個:

Select 
c.custsegment, 
count(distinct clid) as  UniqCalls, 
count(callerid) as TotalCalls 
from call_log c 
inner join 
(select count(disconnectflag) as IvrCalls, custsegment 
from call_log where disconnectflag='IVR' and enteredon = '16-JUL-13' group by custsegment) t 

on c.custsegment=t.custsegment 

where enteredon = '16-JUL-13' 
group by c.custsegment