多个分组的项目

时间:2015-10-15 14:35:55

标签: sql sql-server

我似乎无法找到如何获得我想要的功能。以下是我的表格的示例:

abstract

我希望按照EmpID和ProjectID进行分组,然后总结工作时间。然后我想内部加入与EmpID和ProjectID相关联的Employee和Project表行,但是当我这样做时,我得到一个关于聚合函数的错误,我从研究中理解但我不认为这会有这个问题,因为每个EmpID和ProjectID都会有一行。

Real SQL:

EmpID     |  ProjectID     |    hours_worked   | 
  3             1                    8
  3             1                    8
  4             2                    8
  4             2                    8
  4             3                    8
  5             4                    8

这给出了错误:

  

列'Employees.FirstName'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。

4 个答案:

答案 0 :(得分:3)

您可能希望使用postgres,因此您不必使用OVER (PARTITION BY)

GROUP BY

答案 1 :(得分:2)

您可以执行基本查询以获取分组的小时数,并将其作为其余部分的基础,在CTE中或作为子查询。例如,作为子查询:

SELECT *
FROM
    (SELECT EmpID, ProjectID, SUM(hours_worked) as HoursWorked 
    FROM WorkHours
    GROUP BY EmpID, ProjectID) AS ProjectHours
JOIN Projects
    ON Projects.ID = ProjectHours.ProjectID
JOIN Employees
    ON Employees.ID = ProjectHours.EmpID

答案 2 :(得分:1)

一种方法是使用CTE首先形成您想要的数据,然后加入其他表格

WITH AggregatedHoursWorked
AS
(
SELECT EmpID,
       ProjectID,
       SUM(HoursWorked) AS TotalHours
FROM WorkHours
GROUP BY EmpID, ProjectID
)

SELECT e.FirstName
       p.ProjectName,
       hw.TotalHours
FROM AggregatedHoursWorked hw
INNER JOIN Employees e
   ON hw.EmpID = e.ID
INNER JOIN Projects p
   ON hw.ProjectID = p.ID

答案 3 :(得分:0)

如果使用聚合函数,则必须在聚合函数和/或GROUP BY子句中命名所有列。如果要加入描述(通常对于给定ID唯一),则必须在GROUP BY子句中包含描述列。这不会影响查询结果。