如何通过SQL将同一ID的多记录按条件合并为单行结果
解决方案:将多行同ID记录合并为单行结构化数据
直接用条件聚合函数(CASE 搭配聚合函数如 MAX)就能实现需求,比自连接写法更简洁高效,具体实现如下:
假设原表名为 user_attributes,结构示例:
| ID | Type | Value | Value2 |
|---|---|---|---|
| 1 | Age | 25 | NULL |
| 1 | Height | 175 | NULL |
| 1 | Name | NULL | Alice |
| 2 | Age | 30 | NULL |
| 2 | Name | NULL | Bob |
实现SQL代码:
SELECT ID, -- 提取Name类型对应的Value2字段值 MAX(CASE WHEN Type = 'Name' THEN Value2 END) AS Name, -- 提取Age类型对应的Value字段值 MAX(CASE WHEN Type = 'Age' THEN Value END) AS Age, -- 提取Height类型对应的Value字段值 MAX(CASE WHEN Type = 'Height' THEN Value END) AS Height FROM user_attributes GROUP BY ID;
代码说明:
CASE语句根据Type字段匹配对应的取值逻辑,不匹配的情况返回NULLMAX聚合函数会过滤掉NULL值,只保留当前ID下对应Type的唯一有效值(如果同一ID同一Type有多条记录,MAX会取最大的那个值;如果需要保留所有值,可以换成GROUP_CONCAT(MySQL)或STRING_AGG(SQL Server/PostgreSQL))- 最后通过
GROUP BY ID将同一ID的所有记录合并为单行
对比自连接的优势:
自连接需要多次关联表(比如左连三次分别获取Name、Age、Height),代码冗长且性能不如聚合函数,尤其是数据量较大时,条件聚合的执行效率更高。
内容的提问来源于stack exchange,提问作者Ollie G
相关产品推荐
相关产品推荐

