如何使用sql每周对每日数据进行分组
我试图对员工过去4周的工作小时数进行分组,但我希望每周对其进行分组。例如:如何使用sql每周对每日数据进行分组,sql,sql-server,tsql,Sql,Sql Server,Tsql,我试图对员工过去4周的工作小时数进行分组,但我希望每周对其进行分组。例如: WEEK HOURS Feb 24 to March 2 55 March 3 to March 9 40 March 10 to March 16 48 March 17 to March 23 37 这是我目前所拥有的,请帮忙。谢谢 SET DATEFIRST 1 SELECT CAST(MIN( [DT]) AS V
WEEK HOURS
Feb 24 to March 2 55
March 3 to March 9 40
March 10 to March 16 48
March 17 to March 23 37
这是我目前所拥有的,请帮忙。谢谢
SET DATEFIRST 1
SELECT CAST(MIN( [DT]) AS VARCHAR(20))+' TO '+CAST (MAX([DT]) AS VARCHAR(20)) AS DATE,
SUM(HOURS) AS NUM_HRS
FROM MyTable
GROUP BY DATEPART(WEEK,[DT])
HAVING COUNT(DISTINCT[DT])=7
试试像这样的东西
SELECT
DATEADD(DD,
CONVERT(INT, (DATEDIFF(DD, '1/1/1900', t.DT)/7)) * 7,
'1/1/1900') [WeekBeginDate],
DATEADD(DD,
(CONVERT(INT, (DATEDIFF(DD, '1/1/1900', t.DT)/7)) * 7) + 6,
'1/1/1900') [WeekEndDate],
SUM(HOURS) AS NUM_HRS
FROM MyTable t
GROUP BY CONVERT(INT, DATEDIFF(DD, '1/1/1900', t.DT)/7)
虽然这是蛮力骗局,但我认为在你的情况下它会奏效
EDIT:稍微修改了查询,导致错误的原因是DATEDIFF
计算差异的顺序
这里还有一个例子
编辑2:用日期格式更新了小提琴。若要自定义日期格式,将有所帮助。创建一个日历辅助表,包含年、月、周、日期列(您还可以向其中添加假日和其他有趣的内容,它有许多潜在用途)并在感兴趣的期间填充它 在那之后,就这么简单了:
SELECT sum(hours), cast(min(date) as varchar), cast(max(date) as varchar)
FROM Calendar c
LEFT OUTER JOIN MyTable h on h.Date = c.date
GROUP BY year, week
ORDER BY year, week
您可以尝试类似于
groupbydatediff(DD,DT,'1/1/1900')/7的方法,我需要用我的表中的某种数据替换它吗?我得到了一些像这样奇怪的约会:1785-10-10 00:00:00。000@moe我修改了查询并添加了一个提琴。谢谢,有没有办法不显示日期中的时间?我只想显示不带零的日期。WeekBeginDate具有日期时间格式,但只希望显示日期。thanks@moe您可以随时将日期格式化为您想要的任何格式。已更新格式。添加WHERE子句以在日历上进行筛选table@moe其中DATEDIFF(week,c.date,GETDATE())介于0和3之间
SET DATEFIRST 1
SELECT DATEPART(WEEK,DT) AS WEEK,
SUM(HOURS) AS NUM_HRS
FROM MyTable
WHERE DT >= DATEADD(WEEK, -4, GetDate()),
GROUP BY DATEPART(WEEK,[DT])