SQL联接将返回找到联接而不是分配联接的所有实例

SQL联接将返回找到联接而不是分配联接的所有实例,sql,postgresql,psql,Sql,Postgresql,Psql,我有3个表:OpportunityContact、TaskContact和Tasks OpportunityContact是Opportunity和Contacts的联接表 TaskContact是任务和联系人的联接表 任务包含状态和id。 状态字段可以是“正在进行”、“正在审核”或“已完成” 关系 机会有很多任务。联系人可以分配给许多任务。机会有很多联系人 相关表格 task: ----- id status opportunity_id task_contact ----- tas

我有3个表:OpportunityContact、TaskContact和Tasks

  • OpportunityContact是Opportunity和Contacts的联接表
  • TaskContact是任务和联系人的联接表
  • 任务包含状态和id。
    • 状态字段可以是“正在进行”、“正在审核”或“已完成”
关系 机会有很多任务。联系人可以分配给许多任务。机会有很多联系人

相关表格

task:
-----
id
status
opportunity_id

task_contact
-----
task_id
contact_id

opportunity_contact
-----
opportunity_id
contact_id
问题: 给定联系人id,我想确定该联系人也分配了哪些任务,并统计分配给他们的每个任务的状态

例如:

  • 有2个机会(id=1和id=2)
  • id为1的联系人被分配给两个Opportunity
  • id为1的联系人仅分配给id为1的任务。任务属于id=1的Opportunity
  • 共有25项任务属于id=1的Opportunity,所有任务的状态均为“进行中”
  • 共有24项任务属于id为2的Opportunity,所有任务的状态均为“进行中”
我希望我的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                    |
当id=1的联系人仅分配给1个任务时,为什么我的查询会计算所有25个任务?!?我如何让它包括同一联系人没有分配任务的其他机会


请,谢谢

您在查询中引用的是
opportunity\u contact
,但它不是问题陈述的一部分。联系人位于
task\u 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;

这是因为我想提取分配给它们的所有机会,然后对这些任务状态进行求和/计数。但是,当它们被分配给Opportunity但没有分配给任何任务时,我仍然希望将这些任务相加为0。