Нужна помощь в запросе SQL - PullRequest
0 голосов
/ 07 апреля 2011

У меня есть таблица БД ниже:

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 до текущего месяца (февраль-апрель).Ожидаемое должно быть примерно таким:

   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

Можете ли вы дать мне представление о том, как мне это сделать?Я ценю любую помощь.Спасибо.


Я отредактировал ожидаемый результат выше.В январе не должно было быть никакого подсчета, поскольку оно основано исключительно на месяце TargetEnd .

1 Ответ

1 голос
/ 07 апреля 2011

Если я правильно понимаю ...
- Если запись отображается как Завершено, ей нужно добавить 1 к значению completed, и только за месяц, в котором она была завершена.
- Если записьотображается как «Текущий», для каждого месяца, прошедшего с момента его запуска, необходимо добавить 1 к значению ongoing.

Первая проблема, с которой вы столкнулись, заключается в том, что месяц март не имеет эквивалентной записи во входных данных.Мой предпочтительный способ справиться с этим - создать таблицу поиска по месяцам.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...