2013-02-11 80 views
0

我使用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 

回答

1

這應該工作:

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這是一個星期一。

+0

我應該感到羞愧我自己,這很簡單,這是可笑的:) – 2013-02-11 08:44:03

0

您是否試過使用它?

GROUP BY DAYOFWEEK(DATEADD(D, 0, DATEDIFF(D, 0, T.TaskEndDate))) 
+0

收到以下錯誤'「DAYOFWEEK」是無法識別的內置函數name.' – 2013-02-11 08:27:18

0

嘗試

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與周