2013-02-14 107 views
1

您好,我有以下格式兩個表不會與那些一起加入了記錄:選擇結合

表:

ID | columnx | event | 
    1 |  4 | call | 
    2 |  7 | call | 
    3 |  4 | call | 
    4 |  11 | visit | 

乙表:

columnx | fName | 
    4  | clare | 
    7  | Bill | 
    9  | Tom | 
    11  | Nick | 

我做了一個查詢,如下所示:

Select A.columnx ,B.fName,Count(event) as Calls 
from A 
Left Join B on A.columnx = B.columnx 
where 'event' LIKE 'call'; 

它給輸出如下:

columnx | fname | Calls| 
    4  | Clare | 2 | 
    7  | Bill | 1 | 
    11 | Nick | 0 | 

但我怎麼能得到以下的輸出:

columnx | fname | Calls| 
    4  | Clare | 2 | 
    7  | Bill | 1 | 
    11 | Nick | 0 | 
    9  | Tom | 0 | 

我的意思是,當一個特定的記錄不會被加入我仍然需要選擇與計數記錄作爲0.這可以通過加入來完成,還是我需要找到另一種方式。有什麼建議麼。謝謝。

+0

不可能的,因爲你是要求所有返回的記錄都有一個「呼叫」事件。沒有通話事件的人不會被退回。您必須刪除「where」條款。 – 2013-02-14 17:31:37

+0

如果您放棄'where'事件'LIKE'call';' - 應該訣竅 – Elen 2013-02-14 17:33:38

+0

您可能需要從左連接更改爲右連接。 (我總是讓這兩個人感到困惑,但考慮到你目前在結果中沒有Tom,所以我的猜測是你使用了錯誤的加入)。 – Scott 2013-02-14 17:34:37

回答

0

您可以使用子查詢來獲取呼叫的count()

select dv.columnx, 
    dv.fname, 
    coalesce(dl.calls, 0) Calls 
from device dv 
left join 
(
    select count(dl.event) Calls, dl.columnx 
    from deal dl 
    where dl.event LIKE 'call' 
    group by dl.columnx 
) dl 
    on dv.columnx = dl.columnx 

SQL Fiddle with Demo

或者,這可以在沒有子查詢通過移動WHERE過濾到JOIN來完成:

select dv.columnx, 
    dv.fname, 
    coalesce(count(dl.event), 0) Calls 
from device dv 
left join deal dl 
    on dv.columnx = dl.columnx 
    and dl.event LIKE 'call' 
group by dv.columnx, dv.fname 

SQL Fiddle with Demo

這將返回:

| COLUMNX | FNAME | CALLS | 
--------------------------- 
|  4 | clare |  2 | 
|  7 | Bill |  1 | 
|  9 | Tom |  0 | 
|  11 | Nick |  0 | 
0

移動 '事件' LIKE '呼叫' 來的額外contition左連接

Select B.columnx ,B.fName ,Count(A.'event') as Calls 
    from A 
    Right Join B on A.columnx = B.columnx and A.'event' LIKE 'call' 
    group by B.columnx ,B.fName 
    order by B.columnx 
+0

的主要意圖,但它不會選擇記錄不加入的記錄... – troy 2013-02-14 17:55:59

+0

僅使用列關閉B on select並從表格更改爲b並將其左連接到A或使用正確的連接 – Byron 2013-02-14 18:06:03