我有以下查询,我试图将平均分数按周分组。我遇到的问题是所有日期都以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;
Smaple结果
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
答案 0 :(得分:0)
尝试添加
分组中的YEAR(dateCreated会)
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 :(得分:0)
为了让一周的第一天DATEADD(DAY, -1 + DATEPART(WEEKDAY, [DATE]), [DATE])
更合适,您也可以将它与group by一起使用。
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