SQL Count汇总问题,合并3个表

时间:2019-05-13 18:36:47

标签: sql sql-server count

我正在尝试加入3个表,以仅包括分配给一个以上任务的那些雇员。通过故障排除,我发现我的查询在添加第三张表之前一直有效。具体来说,直到我添加第三张表的列进行分组为止。 我需要添加第三个表,因为它包含了项目的开始和结束日期。

我已经待了好几天了。 我尝试用string_agg绕过group by中第三张表中的列,但是发现它在我们需要使用的程序中不受支持。 我尝试使用变量尝试不同的联接,不同的计数。我曾尝试以不同的组合方式加入表格,然后通过其他错误进行工作。我试图做嵌套的选择语句。

在这一点上,我已经数不清了。我开始使用笛卡尔积,现在发现我认为问题在于将第三个(项目)表分组。

CREATE VIEW Assignments AS

    SELECT a.EmpIDNumber,
           COUNT(*) AS Frequency,
           e.FirstName,
           e.LastName,
           a.PositionOnProject,
           P.AssignedToProject AS ProjectName,
           P.ProjectBeginDate AS StartDate,
           P.FinishOnProject AS End_Date
    FROM Assignments a
         INNER JOIN Employees e ON a.EmpIDNumber = e.EmpIDNumber
         INNER JOIN Projects p ON a.projectID = p.ProjectID
    GROUP BY e.FirstName,
             E.LastName,
             a.PositionOnProject,
             a.EmpIDNumber,
             p.AssignedToProject,
             p.ProjectBeginDate,
             p.FinishOnProject
    HAVING COUNT(*) > 1;

按原样,我没有任何结果。只是空标题。 从选择和分组依据中删除第三个表(项目),我得到了预期的结果,显示了被分配到多个项目的那些雇员。

我知道我做错了事,很开放,渴望了解那是什么。任何帮助做到这一点表示赞赏。

1 个答案:

答案 0 :(得分:1)

如果要为分配给多个项目的员工提供项目详细信息,请使用窗口功能:

SELECT a.EmpIDNumber, a.Frequency,
       e.FirstName, e.LastName, a.PositionOnProject,
       P.AssignedToProject AS ProjectName,
       P.ProjectBeginDate AS StartDate,
       P.FinishOnProject AS End_Date
FROM (SELECT a.*, COUNT(*) OVER (PARTITION BY a.EmpIDNumber) as frequency
      FROM Assignments a
     ) a INNER JOIN
     Employees e
     ON a.EmpIDNumber = e.EmpIDNumber INNER JOIN
     Projects p
     ON a.projectID = p.ProjectID
WHERE frequency > 1;

您的问题是您已将项目信息添加到GROUP BY中。只有一个项目可以满足这些条件,因此HAVNG子句最终将所有内容过滤掉。