2015-10-15 121 views
1

我似乎无法找到如何获得我想要的功能。下面是我的表的示例:多个分组项目

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

我想按EmpID和ProjectID进行分组,然后总结工作小时数。然后,我想要内部连接与EmpID和ProjectID关联的Employee和Project表行,但是当我这样做时,我得到关于聚合函数事件的错误,我从研究中了解到这一点,但我认为这不会有这个问题,因为每个EmpID和ProjectID都会有一行。

真正SQL:

SELECT 
    WorkHours.EmpID, 
    WorkHours.ProjectID, 
    Employees.FirstName 
FROM WorkHours 
INNER JOIN Projects ON WorkHours.ProjectID = Projects.ProjectID 
INNER JOIN Employees ON WorkHours.EmpID = Employees.EmpID 
GROUP BY WorkHours.ProjectID, WorkHours.EmpID 

这给了错误:

Column 'Employees.FirstName' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

回答

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 
+1

我发现这是我理解的最简单的解决方案,并且由于我的截止日期,我可能最终会使用它。 – Samir

3

您可能需要使用OVER (PARTITION BY)这样你就不必使用GROUP BY

Select a.EmpID 
,W.ProjectID 
,W.SUM(hours_worked) OVER (PARTITION BY W.EmpID,W.ProjectID) 
,E.FirstName 
FROM WorkHours W 
INNER JOIN Projects P ON WorkHours.ProjectID = Projects.ProjectID 
INNER JOIN Employees E ON WorkHours.EmpID = Employees.EmpID 
0

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

+0

在这种情况下,它会影响,所以需要使用子查询或另一个可选来处理一个请求,然后下一个。 –

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