2011-04-07 83 views
0

我有如下數據表:在SQL查詢時需要幫助

 
TaskId StartDate TargetEnd TaskStatus 
1  2011-01-01 2011-02-05 completed 
2  2011-02-05 2011-02-05 ongoing 
3  2011-02-04 2011-04-04 completed 
4  2011-04-04 2011-04-04 completed 
5  2011-04-06 2011-04-30 ongoing 

我創建了一個查詢在那裏我能得到的總完成每月日常任務:

SELECT YEAR(TargetEnd) 'YEAR', 
    MONTHNAME(TargetEnd) 'MONTH', 
    SUM(IF(TaskStatus = 'ongoing',1,0)) 'ONGOING', 
    SUM(IF(TaskStatus = 'completed',1,0)) 'COMPLETED', 
    COUNT(TaskId) 'TOTAL' FROM Task_Table GROUP BY YEAR(TargetEnd), MONTH(TargetEnd) 

,其結果是:

 
    YEAR MONTH ONGOING COMPLETED TOTAL 
    2011 January 0  1  1 
    2011 February 0  1  2 
    2011 April  1  2  3 

但我的要求是添加任務#2的ONGOING一部分,而任務仍然是「進行中」,從TargetEnd個月,直到當前月份(2月 - 4月)。預計應該是這樣的:

 
    YEAR MONTH ONGOING COMPLETED TOTAL 
    2011 January 0  0  0 
    2011 February 1  1  1 
    2011 March  1  0  1 
    2011 April  2  2  4 

你能給我一個想法,我該如何做到這一點?我感謝任何幫助。謝謝。


我編輯了上面的預期結果。應該沒有1月份的計數,因爲計數完全基於TargetEnd的月份。

+0

它可能只是我,但你能否給出你希望如何處理每個輸入記錄的例子,以及它如何提供給你最終的例子結果? – MatBailie 2011-04-07 11:17:23

+0

我想你不得不搜索表中的月份,從表中的_first_月開始搜索,直到NOW(),然後做一堆連接,比較每行中的各種值WRT這個月正在迭代。 – 2011-04-07 11:21:41

回答

1

如果我理解正確...
- 如果記錄顯示爲已完成,則需要爲completed值貢獻1,並且僅對於完成的月份貢獻1。
- 如果一條記錄顯示爲正在進行,則需要爲自啓動以來每月的ongoing值貢獻1。

您遇到的第一個問題是3月份,因此在輸入數據中沒有等量記錄。我處理這個問題的首選方法是創建一個數月的查找表。

SELECT 
    lookup.month, 
    SUM(CASE WHEN task_table.TaskStatus = 'Completed' THEN 1 ELSE 0 END) AS completed, 
    SUM(CASE WHEN task_table.TaskStatus = 'Ongoing' THEN 1 ELSE 0 END) AS completed, 
    COUNT(task_table.TaskStatus) AS total 
FROM 
    lookup 
LEFT JOIN 
    task_table 
    ON 
    (
     task_table.TaskStatus = 'Completed' 
     AND lookup.month <= task_table.Target_End 
     AND lookup.month > task_table.Target_End - INTERVAL '1 month' 
    ) 
    OR 
    (
     task_table.TaskStatus = 'Ongoing' 
     AND lookup.month <= task_table.Target_End 
     AND lookup.month > task_table.Start_Date - INTERVAL '1 month' 
    ) 
WHERE 
     lookup.month >= '2011-01-01' 
    AND lookup.month <= '2011-04-01' 
GROUP BY 
    lookup.month 
+0

你說得對。如果記錄完成,它只會在** TargetEnd **月份中有1個計數。我會嘗試你的建議。非常感謝您花時間分享您的想法。 – Brenard 2011-04-07 23:43:46

+0

我仍然無法弄清楚如何根據您的建議獲得預期結果。 :( – Brenard 2011-04-08 06:31:00

+0

我認爲你仍然需要給出每個輸入記錄如何迴應你的建議輸出的詳細細節。 – MatBailie 2011-04-10 15:23:27