SQL如何将同ID对应的多行列数据合并为单行多列输出
解决方法:SQL行转列实现
你需要实现的操作属于行转列(宽表转换),根据你给出的示例,以下是不同场景下的可直接运行的实现方案:
示例原始表数据参考:
ID Sequence Name 1 1 Blue 1 2 Green 1 3 Red
方法1:通用CASE WHEN聚合方案(兼容所有主流SQL数据库)
该方法无需依赖数据库专属语法,MySQL、PostgreSQL、SQL Server、Oracle均可使用,适合Sequence取值固定、可枚举的场景:
SELECT ID, MAX(CASE WHEN Sequence = 1 THEN Name END) AS Seq1_Name, MAX(CASE WHEN Sequence = 2 THEN Name END) AS Seq2_Name, MAX(CASE WHEN Sequence = 3 THEN Name END) AS Seq3_Name FROM 你的表名 GROUP BY ID;
逻辑说明:通过CASE WHEN将对应Sequence的Name匹配到指定列,再用聚合函数合并多行数据为单行,因为同ID下每个Sequence仅对应一条记录,使用MAX/MIN都不会影响最终取值。
方法2:数据库专属行转列语法(Sequence取值固定场景)
部分数据库提供了专门的行转列语法,写法更简洁,以SQL Server/Oracle的PIVOT语法为例:
SELECT ID, [1] AS Seq1_Name, [2] AS Seq2_Name, [3] AS Seq3_Name FROM 你的表名 PIVOT ( MAX(Name) FOR Sequence IN ([1], [2], [3]) ) AS PivotResult;
方法3:动态行转列(Sequence取值不固定/数量不确定场景)
如果Sequence的取值不固定、无法提前枚举,可使用对应数据库的动态SQL拼接功能生成查询语句执行:
- MySQL可通过GROUP_CONCAT拼接动态SQL后执行
- PostgreSQL可配合tablefunc扩展的crosstab函数实现
- SQL Server/Oracle可通过存储过程拼接动态PIVOT语句执行
最终返回效果
以上述示例数据运行后,输出结果如下:
| ID | Seq1_Name | Seq2_Name | Seq3_Name |
|---|---|---|---|
| 1 | Blue | Green | Red |
内容的提问来源于stack exchange,提问作者p450lover
相关产品推荐
相关产品推荐

