2013-02-14 114 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