Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL返回员工_Sql_Sql Server_Count - Fatal编程技术网

SQL返回员工

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 |

我有3个表:Employee、Project、ProjectEmployee

员工有身份证和姓名 项目具有ID、名称、开始日期和结束日期 ProjectEmployee具有ID、EmployeeID和ProjectID 例如:

雇员

    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不是“为我做作业”或“为我做工作”服务。展示你的尝试,也许有人可以提供一些建议。