Как увеличить счетчик, если все строки для определенного идентификатора имеют значение в определенном столбце - PullRequest
0 голосов
/ 29 января 2019

У меня есть 3 таблицы:

SupportPlan

+-----------------------+
| ID | ClientID | RefNo |
+-----------------------+
| 1  | 25       | A001  |
| 2  | 78       | B002  |
+-----------------------+    

SupportPlanGoal

+-------------------------------+
| ID | SupportPlanId | GoalName |
+-------------------------------+
| 1  |  1            | Goal 1   |
| 2  |  1            | Goal 2   |
| 3  |  1            | Goal 3   |
| 4  |  2            | Goal 4   |
+-------------------------------+

SupportPlanAction

+-----------------------------+
| ID | GoalId | DateCompleted |
+-----------------------------+
| 1  | 1      | 2019-01-01    |
| 2  | 1      | 2019-01-10    |
| 3  | 2      | 2018-10-10    |
| 4  | 2      | NULL          |
| 5  | 3      | 2018-03-04    |
| 6  | 4      | NULL          |
+-----------------------------+

Каждый план имеет номерцели, и каждая цель имеет ряд действий.Что я хотел бы сделать, так это подсчитать количество «Завершенных целей» в каждом плане поддержки.Достигнутая цель - это та, в которой все действия имеют значение DateCompleted.

Таким образом, в приведенном выше случае План поддержки 1 имеет 2 выполненных цели из возможных 3, а План поддержки 2 - 0 выполненных целей из возможных 1.

Я пытался использовать

SELECT GoalId, MAX(CASE WHEN CompletedActions = TotalActions THEN 1 ELSE 0 END) AS Status
FROM (
SELECT GoalId, 
       COUNT(1) OVER (PARTITION BY GoalId, 
       CASE WHEN DateCompleted IS NULL THEN 0 ELSE 1 END ORDER BY GoalId) AS CompletedActions, 
       COUNT(1) OVER (PARTITION BY GoalId) AS TotalActions
FROM SupportPlan sp
INNER JOIN SupportPlanGoal spg
  ON sp.Id = spg.SupportPlanId
INNER JOIN SupportPlanGoalAction spga
  ON spg.Id = spga.GoalId
) a
GROUP BY GoalId, CompletedActions, TotalActions

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

+------------------------------------------------------------------------+
| Date Commenced | Goals In Place | Goals Completed | Latest Review Date |
+------------------------------------------------------------------------+
| 2018-01-01     |  3             |  2              | 2019-01-01         |
| 2018-02-02     |  1             |  0              | 2019-02-02         |
+------------------------------------------------------------------------+

(Дата начала будет взята из метки времени, а дата обзора будет взята из другой таблицы)

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 29 января 2019

Агрегируйте действия перед выполнением JOIN.Затем вы можете выполнить остальные расчеты.

SELECT sp.Id, 
       COUNT(spg.id) as num_goals,
       SUM(CASE WHEN spga.num_actions = spga.num_completed_actions THEN 1 ELSE 0 END) as goals_completed,
       COUNT(spa.DateCompleted) as num_actions_completed
FROM SupportPlan sp LEFT JOIN 
     SupportPlanGoal spg
     ON sp.Id = spg.SupportPlanId LEFT JOIN
     (SELECT spga.GoalId, COUNT(*) as num_actions,
             COUNT(spga.DateCompleted) as num_completed_actions,
             MAX(spga.DateCompleted) as max_datecompleted
      FROM SupportPlanGoalAction spga
      GROUP BY spga.GoalId
     ) spga
     ON spg.Id = spga.GoalId
GROUP BY sp.Id;

Я понятия не имею, откуда берется дата обзора.

...