Может кто-нибудь, пожалуйста, посоветовать, почему приведенный ниже sql не возвращает истинный счетчик количества собраний внутри стола собраний, которое имел сотрудник? Возвращает число намного большее, чем обычно. Я хотел бы сохранить всех сотрудников и вернуть 0 или ноль, если у них нет никаких встреч.

select distinct emp.employeeid, count(m.meetingidoriginal) as CountOfMeetings
from dbo.employee as emp
left join dbo.meeting as m
on emp.employeeid = m.employeeid
group by emp.employeeid

Выход

Employeeid, CountofMeetings
116         222
118         300
154         1287

Например, вход в dbo.meeting, где employeeid = '116' возвращает только 6 строк вместо 222, который отображается в операторе sql.

1
Vine 27 Фев 2018 в 09:57

4 ответа

Лучший ответ

Сервер Microsoft SQL имеет очень странную реализацию для COUNT. Вы должны сказать COUNT( DISTINCT colname), чтобы получить правильный результат.

Или COUNT( ALL colname) для подсчета всех значений, отличных от NULL, без фильтрации дубликатов. Это соответствует тому, что любая здравомыслящая реализация будет интерпретировать как пустой COUNT.

1
Ext3h 27 Фев 2018 в 07:07

Попробуй эту логику

SELECT 
    emp.employeeid,
    SUM(CASE WHEN m.employeeid IS NOT NULL THEN 1 ELSE 0 END) AS CountOfMeetings
    FROM dbo.employee AS emp
       LEFT JOIN dbo.meeting AS m 
          ON emp.employeeid = m.employeeid
    GROUP BY emp.employeeid;

Вам не нужен DISTINCT, так как агрегатная функция примет DISTINCT по умолчанию

0
Jayasurya Satheesh 27 Фев 2018 в 07:01

Это предполагает, что таблица собраний имеет разные идентификаторы собраний для каждого сотрудника, тогда вы можете использовать подзапрос и выполнить операцию JOIN с таблицей сотрудников.

SELECT e.employeeid, COALESCE(m.meeting_count, 0) CountOfMeetings 
FROM employee e
LEFT JOIN (
         SELECT employeeid, count(*) meeting_count 
         FROM meeting m
         GROUP BY employeeid
) m on m.employeeid = e.employeeid
0
Yogesh Sharma 27 Фев 2018 в 07:22

Попробуй это:

SELECT e.employeeid, ISNULL(m.meeting_count, 0) CountOfMeetings 
FROM employee e
LEFT JOIN (
         SELECT employeeid, count(employeeid) meeting_count 
         FROM meeting m
         GROUP BY employeeid
) m on m.employeeid = e.employeeid
0
Hina Patel 27 Фев 2018 в 08:30