按周工作分组的SQL Server分组错误

时间:2018-01-15 11:52:01

标签: 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, 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

2 个答案:

答案 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