Sql server 为什么赢了';你不是我的团队吗?

Sql server 为什么赢了';你不是我的团队吗?,sql-server,tsql,Sql Server,Tsql,所以我有这个代码,但它不起作用: 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,'1753

所以我有这个代码,但它不起作用:

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
错误显示“列'Subquery.ManHrs'在选择列表中无效,因为它未包含在聚合函数或GROUP BY子句中”

因此,当我向GROUPBY子句中添加ManHrs时,代码会运行,但不会对任何内容进行分组。不知道我做错了什么

下面是通过将ManHrs添加到GROUPBY子句来运行的代码的屏幕截图,如果更容易阅读:

EDIT:好的,我在Rominus的帮助下解决了这个问题,下面是按预期工作的代码:


您的
分组依据
不起作用,因为它在分组时查看不同的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

一旦你有了这种子查询,你就可以在外部查询中进行平均等操作。

将你的聚合添加到你的分组中。如果我这样做,我会得到你在屏幕截图中看到的所有记录。每个员工应该只有5条记录,持续28-32周。不,我的意思是,通过将聚合表达式添加到组中,而不仅仅是列。如果这不能得到结果,那么在子查询中分组?此外,WHERE子句中的CONVERT和DATEDIFF可能会降低性能。如果你能避免的话,我建议你这样做。它说在GROUPBY子句中不允许使用窗口函数,也许我只是个白痴,而你指的是其他东西。从4周前的星期一开始的最后4周,这是我能想到的最好的方法,所以这就是DATEFIFF的原因。“我相信有更好的方法,但在我看来,这并不是一个大问题。”在我的问题中发布了最后的代码,谢谢