Мое требование состоит в том, чтобы получить все имена сотрудников из таблицы employees, и если в таблице employee нет совпадающих строк, тогда имя сотрудника должно отображаться вместе со счетчиком как 0

CREATE TABLE #EMPLOYEES
(
    employeeId int,
    employeename varchar(50)
)

INSERT INTO #EMPLOYEES VALUES (1,'Dinesh Alla')
INSERT INTO #EMPLOYEES VALUES (2,'ram')
INSERT INTO #EMPLOYEES VALUES (3,'Lakshmi')
INSERT INTO #EMPLOYEES VALUES (4,'sumanth')

CREATE TABLE #LOGS
(
    entityID int,
    EntityCode int,
    employeeID int
)

INSERT INTO #LOGS VALUES (1,201,1)
INSERT INTO #LOGS VALUES (1,201,1)
INSERT INTO #LOGS VALUES (1,201,1)
INSERT INTO #LOGS VALUES (1,201,1)
INSERT INTO #LOGS VALUES (1,201,1)


SELECT 
    te.employeeID, employeeName, 
    COUNT(ISNULL(entityCode, 0)) AS caseEntryCount
FROM 
    #EMPLOYEES Te 
LEFT JOIN 
    #LOGS Tee ON ISNULL(TE.employeeID,0) = ISNULL(Tee.employeeID,0) --OR entityEmployeeID IS NULL
WHERE 
    entityCode = 201 
GROUP BY 
    te.employeeID, employeename, entityCode
ORDER BY 
    employeeID

Проверьте изображение ниже моего вывода.

enter image description here

Но мой ожидаемый результат будет:

employeeID      employeeName        caseEntry
1               Dinesh Alla         5
2               ram                 0
3               Lakshmi             0
4               sumanth             0
2
Dinesh Reddy Alla 3 Май 2016 в 12:28

3 ответа

Лучший ответ

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

SELECT te.employeeID, employeeName, 
    (SELECT COUNT(*) FROM #LOGS Tee
    WHERE Te.employeeID = Tee.employeeID AND Tee.entityCode = 201) AS caseEntryCount
FROM #EMPLOYEES Te 
ORDER BY Te.employeeID

Вы можете переписать свой запрос с помощью LEFT OUTER JOIN, используя GROUP BY, но это медленнее, чем простой запрос в основной таблице с подзапросом для подсчета в поле списка выбора

2
Joe Taras 3 Май 2016 в 09:35

Вам не нужен ISNULL в соединении, просто присоединитесь, а затем используйте IS NOT NULL в предложении WHERE. Что-то вроде этого;

SELECT te.employeeID
    ,employeeName
    ,COUNT(entityCode) AS caseEntryCount
FROM #EMPLOYEES Te
LEFT JOIN #LOGS Tee ON TE.employeeID = Tee.employeeID --OR entityEmployeeID IS NULL
WHERE entityCode = 201
OR entityCode IS NULL
GROUP BY te.employeeID
    ,employeename
    ,entityCode
ORDER BY employeeID

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

1
Rich Benner 3 Май 2016 в 09:39

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

SELECT  e.*
  , COUNT(l.entityID) AS CaseEntry
FROM    #EMPLOYEES e
    LEFT JOIN #LOGS l
    ON l.employeeID = e.employeeId
GROUP BY e.employeeId
  , e.employeename
  , l.EntityCode
ORDER BY e.employeeId;

Старайтесь избегать использования ORDER BY, если порядок не имеет значения. Это повысит производительность запроса.

2
Drishya1 3 Май 2016 в 13:55