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的原因。“我相信有更好的方法,但在我看来,这并不是一个大问题。”在我的问题中发布了最后的代码,谢谢