У меня есть 3 таблицы: OpportunityContact, TaskContact и Tasks.
- OpportunityContact - это таблица соединений для возможностей и контактов
- TaskContact - это таблица соединений для задач и контактов.
- Задача содержит статус и идентификатор.
- Поле состояния может быть в «В процессе», «В проверке» или «Завершено»
Отношения У возможности есть много задач.Контакт может быть назначен на многие задачи.У Оппортуны есть много Контактов.
Соответствующие Таблицы
task:
-----
id
status
opportunity_id
task_contact
-----
task_id
contact_id
opportunity_contact
-----
opportunity_id
contact_id
Проблема: Учитывая contact_id, я хочу определить Задачи, которым этот Контакт тоже назначен И подсчитать статусы каждой Задачи, которым они назначены.
Пример:
- Существует 2 возможности (id = 1 и id = 2)
- Контакт с id = 1 назначен обеим возможностям.
- Контакт с id = 1 назначен только 1 Задаче с id = 1. Задача принадлежит Opportunity, где id = 1
- Есть 25 задач, принадлежащих Opportunity с id = 1, все сстатус «В прогрессе»
- Есть 24 задачи, все принадлежащие Opportunity с id = 2, все со статусом «В прогрессе»
Я хотел бы, чтобы мой результат SQL выдавалследующий результат.
| contact_id | opportunity_id | total_tasks_count | tasks_in_progress_count | tasks_in_review_count |tasks_completed_count |
|--------------------------------------------------------------------------------------------------------------------------
| 1 | 1 | 1 | 1 | 0 |0 |
| -------------------------------------------------------------------------------------------------------------------------
| 1 | 2 | 0 | 0 | 0 |0 |
SQL, который я пробовал:
SELECT distinct
ocr.contact_id,
ocr.opportunity_id,
task.status,
sum(case when task.status is NOT NULL then 1 else 0 end) total_tasks_count,
sum(case when task.status = 'In Progress' then 1 else 0 end) tasks_in_progress_count,
sum(case when task.status = 'In Review' then 1 else 0 end) tasks_in_review_count,
sum(case when task.status = 'Completed' then 1 else 0 end) tasks_completed_count
FROM opportunity_contact ocr
LEFT JOIN task ON ocr.opportunity_id = task.opportunity_id
LEFT JOIN task_contact tc ON task.id = tc.task_id
WHERE
ocr.contact_id = '1'
GROUP BY
ocr.opportunity_id,
task.status,
ocr.contact_id;
Результат, который я получаю:
| contact_id | opportunity_id | total_tasks_count | tasks_in_progress_count | tasks_in_review_count |tasks_completed_count |
|--------------------------------------------------------------------------------------------------------------------------
| 1 | 1 | 25 | 25 | 0 |0 |
| --------------------------------------------------------------------------------------------------------------------------
| 1 | 2 | 24 | 24 | 0 |0 |
Почему мой запрос считает все 25Задачи, когда Контакт с id = 1 назначен только 1 Задаче?!?Как я могу включить в него другую возможность, для которой у того же контакта нет назначенных задач?
Пожалуйста и спасибо!