#sql #sql-server
#sql #sql-сервер
Вопрос:
Отдел(DepartID,DepName)
Сотрудники(Имя, DEPARTIDID)
Что мне нужно, так это количество сотрудников в отделе с именем DepName.
Ответ №1:
Если вы используете SQL Server
версию 2005 или выше, вот еще один возможный способ подсчета сотрудников по отделам. .
SELECT DPT.DepName
, EMP.EmpCount
FROM dbo.Department DPT
CROSS APPLY (
SELECT COUNT(EMP.DepartId) AS EmpCount
FROM dbo.Employees EMP
WHERE EMP.DepartId = DPT.DepartId
) EMP
ORDER BY DPT.DepName
Надеюсь, это поможет.
Пример вывода тестового запроса:
Ответ №2:
Я бы использовал outer join
, а не подзапрос.
SELECT d.DepName, COUNT(e.Name)
FROM Department d
LEFT JOIN Employees e ON e.DepartID = d.DepartID
GROUP BY d.DepartID, d.DepName
Комментарии:
1. Вложенный запрос лучше и позволяет избежать сортировки по DepName
2. @Magnus Скорее всего,
DepartID
это будет ключ PK / кластеризованного индекса и не потребует никакой сортировки. Редактировать: Это немного уклончивый ответ, хотя и интересный общий момент, я проведу несколько тестов.3. Я полагаю, поскольку вы группируете как по DepartID, так и по DepName, а не только по DepName
4. @Magnus — SQL Server распознает, что при группировке по PK другие функционально зависимые столбцы сортировать не нужно.
Ответ №3:
SELECT d.DepName, COUNT(e.Name)
FROM Department d
LEFT JOIN Employees e
ON d.DepartID = e.DepartID
GROUP BY d.DepName
Комментарии:
1. Предполагается, что название отдела уникально.
DepartID
кажется, лучшеgroup by
Ответ №4:
Нет необходимости в вложенном запросе.
SELECT dep.DepName, COUNT(emp.Name)
FROM DepName dep
LEFT OUTER JOIN Employees emp ON dep.DepartID = emp.DepartID
GROUP BY dep.DepName
Комментарии:
1. Предполагается, что название отдела уникально.
DepartID
кажется, лучшеgroup by
Ответ №5:
SELECT COUNT(DISTINCT Name) FROM
Department AS d, Employees AS e
WHERE d.DepartID=e.DepartID AND d.DepName = '$thename'
Ответ №6:
И чтобы избежать использования group by
и сэкономить вам операцию сортировки в queryplan:
SELECT
Department.DepName,
(SELECT COUNT(*)
FROM Employees
WHERE Employees.DepartID = Department.DepartID)
FROM
Department