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