我有一张桌子:
( EmployeeID (int), CourseID (int))
是1对多关系。员工可以有很多课程ID。
EmployeeID
1
1
2
2
3
3
3
CourseID
1
2
2
3
1
2
3
例如,我想知道拥有courseID 1和2的员工数量
Select COUNT([employee ID])
From EmployeeTable
Where courseID = 1 and courseID = 2
答案应为2,因为只有EmployeeID 1和EmployeeID 3具有CourseID 1和2.
答案 0 :(得分:2)
对FROM子句返回的每一行评估WHERE子句。正如您所知,WHERE子句检查课程ID是否有2个不同的值,这将永远不会评估为true。我看到的解决方案是使用自联接。
SELECT COUNT(*) FROM EmployeeTable AS ET1 JOIN EmployeeTable AS ET2 ON ET1.[employee ID] = ET2.[employeeID] AND ET1.[course
ID] = 1 AND ET2.[course ID] = 2
这看起来像一个连接表。如果您有一个单独的员工表,则可以使用子查询更轻松地执行某些操作。
答案 1 :(得分:2)
这是使用count distinct
选择和统计所有同时拥有课程1和2的员工的快捷方式
select count(*) from (
select EmployeeID
from EmployeeTable
where CourseID in (1,2)
group by EmployeeID
having count(distinct CourseID) = 2
) t
答案 2 :(得分:1)
这不是那么简单......你的尝试将返回0,因为没有一行同时具有CourseID = 1和CourseID = 2。
您可以使用子查询来执行此操作:
SELECT COUNT(*)
FROM EmployeeTable e1
WHERE EXISTS
(
SELECT *
FROM EmployeeTable e2
WHERE e2.CourseID = 1
AND e2.EmployeeID = e1.EmployeeID
)
AND EXISTS
(
SELECT *
FROM EmployeeTable e3
WHERE e3.CourseID = 2
AND e3.EmployeeID = e1.EmployeeID
)