SQL返回员工
我有3个表:Employee、Project、ProjectEmployee 员工有身份证和姓名 项目具有ID、名称、开始日期和结束日期 ProjectEmployee具有ID、EmployeeID和ProjectID 例如: 雇员SQL返回员工,sql,sql-server,count,Sql,Sql Server,Count,我有3个表:Employee、Project、ProjectEmployee 员工有身份证和姓名 项目具有ID、名称、开始日期和结束日期 ProjectEmployee具有ID、EmployeeID和ProjectID 例如: 雇员 ID | Name ----+------- 1 | Amy 2 | Ben 3 | Charlie 计划 ID | Name | StartDate |
ID | Name
----+-------
1 | Amy
2 | Ben
3 | Charlie
计划
ID | Name | StartDate | EndDate
----+-----------+---------------+--------------
1 | P01 | 1-Jan-17 | 1-Feb-17
2 | P02 | 2-Feb-17 | 20-Feb-17
3 | P03 | 15-Mar-17 | 31-Mar-17
4 | P04 | 30-Nov-17 | 30-Dec-17
项目员工
ID | EmployeeID | ProjectID
----+---------------+-------------
1 | 1 | 1
2 | 1 | 2
3 | 1 | 3
4 | 1 | 4
5 | 2 | 1
6 | 2 | 2
7 | 3 | 1
我想创建一个查询,找出在项目中工作的返回员工总数。例如,有3名员工在P01中工作,但只有2名员工在P1结束日期后180天内在后续项目中工作,将一个项目的结束日期与下一个项目的开始日期进行比较
例如:
对于项目P01,6个月内的后续项目为P02和P03
对于项目P02,6个月内的后续项目为P03
对于P03项目,6个月内的后续项目为无
结果应列出所有项目及其员工总数和返回员工总数计数:
Project | TotalEmployees | TotalReturningEmployees
--------+-------------------+-------------------------------------------
P01 | 3 | 2 (Both Amy and Ben returning)
P02 | 2 | 1 (Only Amy worked in P03)
P03 | 1 | 0 (Amy worked in P04, but it's not within 6 months after P03 ended)
P04 | 1 | 0
因为我是SQL的新手,所以我尝试用MS Access解决这个问题。这是我到目前为止得到的,这是有效的,但只显示了一个项目
SELECT SelectedProject AS Project,
COUNT(*) AS ReturningEmployees
FROM
(
SELECT DISTINCT
ProjectEmployee.EmployeeID
FROM Project
INNER JOIN ProjectEmployee
ON Project.ID = ProjectEmployee.ProjectID
WHERE (
(ProjectEmployee.EmployeeID IN (
SELECT ProjectEmployee.Employeeid
FROM ProjectEmployee
WHERE ProjectEmployee.Projectid = SelectedProject
)
)
AND ((Project.StartDate)
BETWEEN
(
SELECT Project.EndDate FROM Project WHERE Project.id = SelectedProject
) AND (
(
SELECT Project.EndDate FROM Project WHERE Project.id = SelectedProject
) + 180
)
)
)
) AS Returning;
此查询可以完成此任务
SELECT p3.ID,
(
SELECT COUNT(*) FROM ProjectEmployee p1 WHERE p1.pid = p3.pid
),
COUNT(p2.pid)
FROM Project p3
LEFT JOIN ProjectEmployee p2 ON p2.ProjectID = p3.ID and p2.EmployeeID IN
(
SELECT pe.EmployeeID
FROM ProjectEmployee pe
WHERE pe.StartYear <= DateAdd(month, 6, p3.EndDate)
)
GROUP BY p3.ID
此查询可以完成此任务
SELECT p3.ID,
(
SELECT COUNT(*) FROM ProjectEmployee p1 WHERE p1.pid = p3.pid
),
COUNT(p2.pid)
FROM Project p3
LEFT JOIN ProjectEmployee p2 ON p2.ProjectID = p3.ID and p2.EmployeeID IN
(
SELECT pe.EmployeeID
FROM ProjectEmployee pe
WHERE pe.StartYear <= DateAdd(month, 6, p3.EndDate)
)
GROUP BY p3.ID
做一个小组。用于执行条件聚合的用例表达式。StackOverflow不是“为我做作业”或“为我做工作”服务。展示你所做的尝试,也许有人能提供一些建议。用于执行条件聚合的用例表达式。StackOverflow不是“为我做作业”或“为我做工作”服务。展示你的尝试,也许有人可以提供一些建议。