2015-10-15 120 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