SQL - Группа с левым соединением

У меня есть две таблицы. Таблица A имеет список имен сотрудника. Таблица B является сложной таблицей с информацией о телефонных вызовах, выполненных сотрудниками.

Моя цель состоит в том, чтобы сделать таблицу со столбцами 'именем' и '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 
12
задан OMG Ponies 12 July 2010 в 20:23
поделиться

2 ответа

Это проблема JOIN, а не NULL: ваш фильтр меняет OUTER на INNER JOIN. Это означает, что вы получаете COUNT только там, где у вас есть строки в CallTable (B), а не OUTER JOIN, как вы хотели.

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 

Edit: после вашего комментария в другом месте, все ваши фильтры на B должны быть в производной таблице, а не во внешней.

33
ответ дан 2 December 2019 в 04:16
поделиться

Поскольку вы используете LEFT JOIN, ссылки на таблицу, определенную в LEFT JOIN, могут быть нулевыми. Строки есть, вы просто не видите значение счетчика как ноль. Это означает, что вам нужно преобразовать это значение NULL в ноль (в данном случае):

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

В этом примере используется COALESCE , стандартное средство ANSI для обработки значений NULL. Он вернет первое ненулевое значение, но если его не найти, вернет null. ISNULL - допустимая альтернатива для SQL Server, но не переносима для других баз данных, в то время как COALESCE. Вот статья MSDN, в которой сравниваются две функции .

2
ответ дан 2 December 2019 в 04:16
поделиться