在SQL查询中需要帮助

时间:2011-04-07 11:11:49

标签: mysql 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 的月份。

1 个答案:

答案 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