SQL Server按周和年分组错误

SQL Server按周和年分组错误,sql,sql-server,Sql,Sql Server,我在下面的查询中尝试按周对平均分数进行分组。我面临的问题是,所有日期都返回为2018年。如何使返回日期的年份正确 DECLARE @s DATETIME= '2017-12-18', @e DATETIME= '2018-01-15'; SELECT ROUND(AVG(CAST(MYTABLE.score AS FLOAT)), 1) AS avgScore, DATEADD(week, DATEPART(wk, dateCreated) - 1, DATEADD(wk, DAT

我在下面的查询中尝试按周对平均分数进行分组。我面临的问题是,所有日期都返回为2018年。如何使返回日期的年份正确

DECLARE @s DATETIME= '2017-12-18', @e DATETIME= '2018-01-15';
SELECT ROUND(AVG(CAST(MYTABLE.score AS FLOAT)), 1) AS avgScore,
       DATEADD(week, DATEPART(wk, dateCreated) - 1, DATEADD(wk, DATEDIFF(wk, -1, DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0)), 0)) AS dateCreated
FROM MYTABLE
WHERE MYTABLE.dateCreated BETWEEN @s AND @e
GROUP BY DATEPART(wk, dateCreated)
ORDER BY dateCreated;
简单结果

avgScore | dateCreated
----------------------
5.2      | 2018-12-17
4.6      | 2018-12-24
5.5      | 2018-01-01
6.5      | 2018-01-08
4.2      | 2018-01-15
尝试添加

年份(创建日期)

分组

declare @s datetime = '2017-12-18', @e datetime = '2018-01-15';


SELECT ROUND(AVG(CAST(MYTABLE.score AS FLOAT)), 1) AS avgScore, dateadd(week,DATEPART(wk, dateCreated)-1, DATEADD(wk, DATEDIFF(wk,-1,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)), 0)) AS dateCreated
FROM MYTABLE 
WHERE MYTABLE.dateCreated between @s and @e 
GROUP BY YEAR(dateCreated), DATEPART(wk, dateCreated) 
ORDER BY dateCreated

因为你是按周分组的,所以周只是一个数字。因此,您放弃了年份。

用于获取一周的第一天
日期添加(天,-1+日期部分(工作日,[DATE]),[DATE])
更合适,您还可以将其与分组依据一起使用

SET DATEFIRST  1;
declare @s datetime = '2017-12-18', @e datetime = '2018-01-15';

SELECT ROUND(AVG(CAST(MYTABLE.score AS FLOAT)), 1) AS avgScore, 
DATEADD(DAY, -1 + DATEPART(WEEKDAY, dateCreated), dateCreated)  AS dateCreated
FROM MYTABLE 
WHERE MYTABLE.dateCreated between @s and @e 
GROUP BY DATEADD(DAY, -1 + DATEPART(WEEKDAY, dateCreated), dateCreated)  
ORDER BY dateCreated

列别名不等于列名。。。选择另一个列别名!您正在使用
GETDATE()
作为基准年。使用带有日期、年份和周数的日历表,而不是按日期部分(wk,dateCreated)分组并尝试重新创建原始日期。由于服务器不必计算周数和年数,因此查询将更加简单和快速。您甚至可以将WeekStart或WeekEnd添加到日历表中,以将查询转换为简单的联接,并
按日历分组。年份,日历。WeekNumber
如果您想这样做,您需要按周和年份分组,因为“第43周”之类的值不会告诉您是今年、去年还是1066年。所以类似于
GROUP BY DATEPART(wk,dateCreated),DATEPART(yyy,dateCreated)