SQL-соединение возвращает все экземпляры, в которых соединение найдено, а не присоединено - PullRequest
0 голосов
/ 09 февраля 2019

У меня есть 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 Задаче?!?Как я могу включить в него другую возможность, для которой у того же контакта нет назначенных задач?

Пожалуйста и спасибо!

1 Ответ

0 голосов
/ 09 февраля 2019

Вы ссылаетесь на opportunity_contact в своем запросе, но это не является частью формулировки проблемы.Контакт находится в таблице task_contact, поэтому этого должно быть достаточно для фильтрации:

SELECT ocr.contact_id, task.task_id,
       count(task.status) as total_tasks_count, 
       sum( (task.status = 'In Progress')::int)  as tasks_in_progress_count, 
       sum( (task.status = 'In Review')::int) as tasks_in_review_count, 
       sum( (task.status = 'Completed')::int as tasks_completed_count
FROM task JOIN
     task_contact tc
     ON task.id = tc.task_id 
WHERE tc.contact_id = '1'
GROUP BY ocr.contact_id, task.id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...