如何合并数据表中同一ID下同时存在A和B值的行?
SQL合并特定ID的A/B值需求实现
原数据表
| ID | VALUE |
|---|---|
| 1 | A |
| 2 | A |
| 2 | B |
| 2 | C |
| 3 | B |
需求说明
当某个ID的VALUE列同时存在A和B值时,将这两行合并为一行(显示为“A & B”),其余行保持原样。
期望结果
| ID | VALUE |
|---|---|
| 1 | A |
| 2 | A & B |
| 2 | C |
| 3 | B |
原SQL问题分析
你提供的SQL语句存在多处错误:
VALUE IN(A)缺少单引号,正确写法应为VALUE IN ('A');- 逻辑错误:单个VALUE不可能同时等于A和B,
VALUE IN('A') AND VALUE IN('B')永远为假; - GROUP BY的逻辑不符合需求,导致返回空表。
正确实现方案
通过分两部分查询再合并的方式实现:
- 先筛选出同时包含A和B的ID,为这些ID生成合并后的行;
- 查询所有不需要合并的行(排除已合并的A、B行,以及非目标ID的所有行);
- 用
UNION ALL合并两部分结果并排序。
-- 生成合并后的A & B行 SELECT ID, 'A & B' AS VALUE FROM TABLE_NAME WHERE ID IN ( SELECT ID FROM TABLE_NAME WHERE VALUE IN ('A', 'B') GROUP BY ID HAVING COUNT(DISTINCT VALUE) = 2 ) GROUP BY ID UNION ALL -- 保留不需要合并的行 SELECT ID, VALUE FROM TABLE_NAME WHERE NOT ( ID IN ( SELECT ID FROM TABLE_NAME WHERE VALUE IN ('A', 'B') GROUP BY ID HAVING COUNT(DISTINCT VALUE) = 2 ) AND VALUE IN ('A', 'B') ) ORDER BY ID, VALUE;
说明
- 子查询
SELECT ID FROM TABLE_NAME WHERE VALUE IN ('A', 'B') GROUP BY ID HAVING COUNT(DISTINCT VALUE) = 2用于精准筛选出同时拥有A和B的ID; - 第一部分查询为这些ID生成合并行;
- 第二部分查询排除了目标ID下的A、B行,保留其他所有行;
ORDER BY ID, VALUE保证结果顺序与期望一致。
内容的提问来源于stack exchange,提问作者Rick Pfleeger
相关产品推荐
相关产品推荐

