2014-01-22 50 views
0

結果到一個1行組我有一個表中,我想通過orig調用和term調用在一個行組中得到這個表。我會指望它多少次有傳入和outgoing..here的表搜索查詢計數兩個字段,並由

調用表

|ID | originating call | terminating call | call type  
| 1 | 123    |  123   | incoming 
| 2 | 123    |  123   | outgoing 
| 3 | 123    |  321   | incoming 
| 4 | 123    |  321   | incoming 

結果應該是

originating call | terminating call | incoming | outgoing 
     123   |  123   |  1  | 1 
     123   |  321   |  2  | 0 

我已經嘗試了數()作爲傳入和計數()作爲傳出,但我不知道接下來應該做什麼。我應該通過始發呼叫和終止呼叫對它進行分組嗎?

+0

這是SQL Server還是MySQL?你真的在使用哪個數據庫? –

+0

你在用什麼:MySQL或SQL Server?除了顯示的兩個值之外,是否還有'call type'? –

+1

@ PM77-1抱歉的標籤,我用mysql .. – Vincent

回答

3

這被稱爲條件聚合。您可以使用case聲明做了基本查詢:

select originating, terminating, 
     sum(case when calltype = 'incoming' then 1 else 0 end) as incoming, 
     sum(case when calltype = 'outgoing' then 1 else 0 end) as outgoing, 
from calltable ct 
group by originating, terminating; 

這適用於所有數據庫中。要獲得id列在數據庫中有所不同。在SQL Server中,你會怎麼做:

select row_number() over (order by (select NULL)) as id, 
     originating, terminating, 
     sum(case when calltype = 'incoming' then 1 else 0 end) as incoming, 
     sum(case when calltype = 'outgoing' then 1 else 0 end) as outgoing, 
from calltable ct 
group by originating, terminating; 

在MySQL中,你會得到id爲:

select @id := @id + 1 as id, 
     originating, terminating, 
     sum(calltype = 'incoming') as incoming, 
     sum(calltype = 'outgoing') as outgoing, 
from calltable ct cross join 
    (select @id := 0) const 
group by originating, terminating; 

雖然case工作在MySQL的罰款,該版本採用了短手是在方便這個情況。

+1

+1聰明的計數器方法,從未嘗試過這種方式... – PinnyM

+0

哇。我會試試這個。謝謝:D – Vincent

+0

不應該算數而不是總數嗎? – Vincent

0

使用以下查詢:

select originating, terminating, 
     sum(case when calltype ='incoming' then 1 else 0 end) as incoming, 
     sum(case when calltype ='outgoing' then 1 else 0 end) as outgoing, 
from Table_Name 

組由始發,終止;