У меня есть 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 |
+------------------------------------------------------------------------+
(Дата начала будет взята из метки времени, а дата обзора будет взята из другой таблицы)
Любая помощь будет принята с благодарностью.