2017-08-11 97 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

找到你的帮助,发布最终的代码在我的问题,谢谢 –