2017-08-11 104 views
1

所以我有這樣的代碼,它不工作:爲什麼我的聚合組不會?

SET DATEFIRST 1 
SELECT 
    WeekNumber-1 AS [WeekNumber], 
    EmplName, 
    ROUND(SUM(ManHrs), 2) AS [ManHrs], 
    ROUND((SUM(ManHrs) OVER(PARTITION BY EmplName)/((CONVERT(FLOAT, GETDATE())- 
    CONVERT(FLOAT, DATEADD(dd, 
    ((DATEDIFF(dd,'17530101',GETDATE())/7)*7)-29,'17530101')))/7)), 2) AS [Avg 
    Weekly Man Hrs] 
FROM 
(
    SELECT 
    DATEPART(wk, TicketDate) AS WeekNumber, 
    e.EmplName, 
    t.WorkCntr, 
    t.ManHrs 
    FROM TimeTicketDet t JOIN EmplCode e ON t.EmplCode = e.Emplcode 
    WHERE CONVERT(DATE, TicketDate) > DATEADD(dd, 
((DATEDIFF(dd,'17530101',GETDATE())/7)*7)-29,'17530101') 
) AS [Subquery] 
GROUP BY WeekNumber, EmplName 
ORDER BY 2, 1 

錯誤說,因爲它不是在聚合函數或GROUP包含「列Subquery.ManHrs'在選擇列表中無效BY子句「

因此,當我將ManHrs添加到GROUP BY子句時,代碼將運行,但沒有任何分組。不知道我做錯了

下面是通過添加ManHrs到GROUP BY子句,如果它更易於閱讀運行代碼的截圖:

enter image description here

編輯:好的,所以我想通了與Rominus的幫助下,這裏是按預期工作代碼:

enter image description here

+0

將您的聚合添加到您的分組 –

+0

如果我這樣做,我會得到所有的記錄,你可以在屏幕截圖中看到。每個員工應該只有5個記錄,數週28-32 –

+0

不,我的意思是將字面值加到組中,而不是僅僅將列添加到組中。如果這不會得到結果,可能在子查詢中進行分組?此外,您可能正在使用WHERE子句中的CONVERT和DATEDIFF來殺死性能。如果你能避免這一點,我會推薦它。 –

回答

1

GROUP BY不工作因爲它在分組時會查看ManHrs的不同值,因此它將具有不同ManHrs值的行視爲在不同的組中。你需要做的是在你進行平均分組之前一週將ManHrs求和。所以,你想最終的子查詢的兩層,這將是這個樣子簡單的例子:

SELECT a.EmplName, a.WeekNumber, SUM(a.Manhrs) as totHrs 
FROM 
    (SELECT 
    DATEPART(wk, TicketDate) AS WeekNumber 
    , e.EmplName 
    , t.ManHrs 
    FROM TimeTicketDet t JOIN EmplCode e ON t.EmplCode = e.Emplcode) as a 
group by a.EmplName, a.WeekNumber 

一旦有了這種類型的子查詢,你可以做你的平均和這樣的外部查詢。

+0

找到你的幫助,發佈最終的代碼在我的問題,謝謝 –