SQL - 使用左连接分组

Bra*_*ndi 12 sql t-sql sql-server join

我有两张桌子.表A列出了员工姓名.表B是一个复杂的表格,其中包含员工拨打电话的信息.

我的目标是创建一个包含列'name'和'callCount'的表.我的目标是通过'左连接'和'组合'来做到这一点,但我一直想念那些没有打电话的员工.我怎样才能让它保持名称并在那里放零?

也许我很亲密,有人可以指出我的拼写错误?在此先感谢您的帮助,这是SQL:

SELECT A.name, COUNT(B.call_id) AS 'outgoing call count' 
FROM EmployeeTable A 
LEFT JOIN CallTable B 
ON A.name = B.call_from_name
WHERE B.call_type LIKE 'outgoing' 
AND B.voice_mail = '0' 
...
GROUP BY A.name 
Run Code Online (Sandbox Code Playgroud)

gbn*_*gbn 33

这是一个JOIN而不是NULL问题:您的过滤器正在将OUTER更改为INNER JOIN.这意味着只有在CallTable(B)中有行而不是你想要的OUTER JOIN时才能获得COUNT.

SELECT A.name, COUNT(B.call_id) AS 'outgoing call count' 
FROM
   EmployeeTable A 
   LEFT JOIN
   (
   SELECT call_from_name, call_id FROM CallTable
   WHERE call_type LIKE 'outgoing' 
     AND voice_mail = '0'
     AND /* other CallTable filters */
   ) B
   ON A.name = B.call_from_name
WHERE
     /* only EmployeeTable A filters */
GROUP BY A.name 
Run Code Online (Sandbox Code Playgroud)

编辑:在其他地方发表评论后,B上的所有过滤器必须位于派生表中,而不是位于外部的位置.

  • 在不需要通配符比较时,请注意使用LIKE.它真的可以扼杀你的查询速度.只需进行常规的相等比较:WHERE call_type ='outgoing' (3认同)
  • 有关进一步说明:http://wiki.lessthandot.com/index.php/WHERE_conditions_on_a_LEFT_JOIN (3认同)