SQL - группировка по левому соединению - PullRequest
10 голосов
/ 13 июля 2010

У меня есть две таблицы.Таблица 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 

Ответы [ 2 ]

33 голосов
/ 13 июля 2010

Это проблема СОЕДИНЕНИЯ, а не NULL: ваш фильтр заменяет ВНЕШНЕЕ НА ВНУТРЕННЕЕ СОЕДИНЕНИЕ.Это означает, что вы получите 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 

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

2 голосов
/ 13 июля 2010

Поскольку вы используете 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. Он вернет первое ненулевое значение, но если ничего не может быть найдено, он вернет ноль. ISNULL - допустимая альтернатива на SQL Server, но она не переносима на другие базы данных, пока COALESCE - это. Вот статья MSDN, сравнивающая две функции .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...