Mysql 需要SQL查询方面的帮助吗

Mysql 需要SQL查询方面的帮助吗,mysql,sql,Mysql,Sql,我的DB表如下: 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 结果是:

我的DB表如下:

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 结果是:

YEAR MONTH ONGOING COMPLETED TOTAL 2011 January 0 1 1 2011 February 0 1 2 2011 April 1 2 3 你能告诉我怎样才能做到这一点吗?谢谢你的帮助。谢谢



我编辑了上面的预期结果。1月份应该没有统计,因为统计仅基于TargetEnd的月份

如果我的理解正确…
-如果记录显示为已完成,则它需要为
已完成的
值贡献1,并且仅为其完成的月份贡献1。
-如果记录显示为进行中,则自开始以来,每个月都需要为
进行中的
值贡献1

您遇到的第一个问题是三月,因此在输入数据中没有等价的记录。我比较喜欢的处理方法是创建一个月的查找表

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
选择
月,
已完成的总和(当task_table.TaskStatus='Completed'然后1 ELSE 0 END时的情况),
完成时的总和(当task_table.TaskStatus='正在进行',然后1或0结束时的情况),
计数(task_table.TaskStatus)为总计
从…起
查找
左连接
任务表
在…上
(
task_table.TaskStatus='Completed'
和lookup.month task\u table.Target\u End-间隔“1个月”
)
或
(
task_table.TaskStatus='正在进行'
和lookup.month task_table.Start_Date-间隔“1个月”
)
哪里
lookup.month>=“2011-01-01”

和lookup.month可能只有我一个人,但是你能举例说明你希望如何处理每个输入记录,以及如何将其输入到你给出的最终示例结果中吗?我想你必须,而不是搜索表中表示的月份,而是从表中表示的第一个月开始搜索到
NOW()
,并进行一系列连接,比较每行中的不同值,w.r.t.迭代的月份。您答对了。如果记录已完成,则在TargetEnd month上只会有1个计数。我会试试你的建议。非常感谢您花时间分享您的想法。我仍然不知道如何根据您的建议获得预期的结果(我认为您仍然需要给出每个输入记录如何倾斜到建议输出的具体细节。 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
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