我似乎无法找到如何获得我想要的功能。以下是我的表格的示例:
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子句中。
答案 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子句中包含描述列。这不会影响查询结果。