SQL自Left Join同列数据遇重复行及行列转换需求咨询
解决项目阶段数据查询重复行问题
你用自Left Join出现重复行的核心原因是:只关联了Project ID,没在连接条件里限定两张表的阶段,导致出现不必要的交叉匹配,生成了多条不符合预期的记录。下面给两种实用的解决办法:
方法一:条件聚合(推荐,逻辑更清晰)
通过分组聚合直接把同一项目的不同阶段数据合并成一行,精准提取所需日期:
SELECT Project_ID, MAX(CASE WHEN Phase = 'Approve' THEN Date END) AS Approve_Date, MAX(CASE WHEN Phase = 'Close' THEN Date END) AS Close_Date FROM project_phases WHERE Phase IN ('Approve', 'Close') GROUP BY Project_ID HAVING MAX(CASE WHEN Phase = 'Approve' THEN Date END) IS NOT NULL;
GROUP BY Project_ID把同一项目的多行数据合并为一行CASE语句精准抓取对应阶段的日期,MAX用来确保每个阶段只取唯一有效日期(每个项目每个阶段只会有一条记录)HAVING子句过滤掉没有Approve记录的项目,严格符合“已进入Approve阶段”的需求
方法二:修正自Left Join写法
调整连接条件,明确限定两张表的阶段,避免交叉匹配:
SELECT a.Project_ID, a.Date AS Approve_Date, c.Date AS Close_Date FROM project_phases a LEFT JOIN project_phases c ON a.Project_ID = c.Project_ID AND c.Phase = 'Close' WHERE a.Phase = 'Approve';
- 左表
a只筛选Approve阶段的记录,作为主数据 - 右表
c通过Project ID关联的同时,限定只匹配Close阶段的记录 - 这样每个Approve记录只会对应0或1条Close记录,不会出现重复行
内容的提问来源于stack exchange,提问作者bmassdata
相关产品推荐
相关产品推荐

