У меня есть две таблицы. Таблица 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
Это проблема 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 должны быть в производной таблице, а не во внешней.
Поскольку вы используете 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, в которой сравниваются две функции .