分组日期和记录
问题描述:
我使用SQL Server 2008:分组日期和记录
我有一个查询,统计任务的总数和每天完成的任务总数
我需要有相同的每周的逻辑(全天)。 我不需要每天都有记录(这是否重要?如果是这样,我该如何插入一个空的记录?)。
以下是每天计数任务的当前查询:
SELECT
DATEADD(D, 0, DATEDIFF(D, 0, T.TaskEndDate)) AS 'EndDate',
COUNT(T.TaskID)NumOfTasks,
COUNT(CASE WHEN T.TaskRecordsStatus = 2 THEN T.TaskID END) NumOfCompleteTasks
FROM
dwh.Bks_DWH_TaskRecords_V1 T
GROUP BY
DATEADD(D, 0, DATEDIFF(D, 0, T.TaskEndDate))
ORDER BY
DATEADD(D, 0, DATEDIFF(D, 0, T.TaskEndDate)) DESC
这是查询输出(几行作为样品):
End Date NumOfTasks NumOfCompleteTasks
2015-06-27 00:00:00.000 1 0
2013-09-17 00:00:00.000 1 0
2013-02-11 00:00:00.000 1 1
2013-02-07 00:00:00.000 4 0
2013-02-06 00:00:00.000 1 0
2013-02-04 00:00:00.000 1 0
2013-01-20 00:00:00.000 2 0
2013-01-19 00:00:00.000 1 0
2013-01-18 00:00:00.000 2 0
2013-01-17 00:00:00.000 5 0
这是所需要的结果:
End Date NumOfTasks NumOfCompleteTasks
2013-01-01 00:00:00.000 10 0
2013-01-07 00:00:00.000 6 1
2013-01-14 00:00:00.000 0 0
2013-01-21 00:00:00.000 0 0
2013-01-28 00:00:00.000 7 3
2013-02-05 00:00:00.000 2 1
2013-02-12 00:00:00.000 0 0
答
这应该工作:
SELECT EndDate = Dateadd(week, Datediff(week, 0, T.TaskEndDate), 0),
NumOfTasks = COUNT(T.TaskID),
NumOfCompleteTasks = COUNT(CASE WHEN T.TaskRecordsStatus = 2 THEN T.TaskID END)
FROM
dwh.Bks_DWH_TaskRecords_V1 T
GROUP BY
Dateadd(week, Datediff(week, 0, T.TaskEndDate), 0)
ORDER BY
Dateadd(week, Datediff(week, 0, T.TaskEndDate), 0) DESC
SQL-Fiddle与简化的数据
这是假设你想星期一作为一周的第一天,因为日0 1900-01-01
这是一个星期一。
答
您是否试过使用它?
GROUP BY DAYOFWEEK(DATEADD(D, 0, DATEDIFF(D, 0, T.TaskEndDate)))
+0
收到以下错误'“DAYOFWEEK”是无法识别的内置函数name.' – 2013-02-11 08:27:18
答
尝试
SELECT
DATEADD(D, DATEDIFF(D, T.TaskEndDate, 0), 0) AS 'EndDate',
COUNT(T.TaskID) NumOfTasks,
SUM(CASE WHEN T.TaskRecordsStatus = 2 THEN 1 ELSE 0 END) NumOfCompleteTasks
FROM
dwh.Bks_DWH_TaskRecords_V1 T
GROUP BY
DATEADD(D, DATEDIFF(D, T.TaskEndDate, 0), 0)
ORDER BY
DATEADD(D, DATEDIFF(D, T.TaskEndDate, 0), 0) DESC
对于每个DATEADD每周的版本变化d与周
我应该感到羞愧我自己,这很简单,这是可笑的:) – 2013-02-11 08:44:03