我有以下数据库表:
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 :(得分:1)
如果我理解正确...
- 如果记录显示为已完成,则需要为completed
值贡献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