SQL多行合并问题:如何将同OrderID的多行记录合并为一行
解决方法:合并相同OrderID的多行记录
别担心,这个需求其实非常常见,用SQL的分组+字符串聚合函数就能轻松搞定,我给你一步步讲清楚~
核心思路
我们需要把同一个OrderID对应的所有产品合并成一个列表,只保留唯一的OrderID。这里不用自连接(自连接更适合关联不同行的关联数据),而是用GROUP BY分组,搭配字符串聚合函数来拼接产品名称。
不同数据库的具体写法
因为不同数据库的字符串聚合函数略有不同,我给你列几种常用的:
1. SQL Server / PostgreSQL
用STRING_AGG函数来拼接字符串:
SELECT OrderID, STRING_AGG(Product, ', ') AS Products -- 这里的', '是产品之间的分隔符,可按需修改(比如换成'; ') FROM YourTableName -- 替换成你实际的表名 GROUP BY OrderID;
2. MySQL / MariaDB
用GROUP_CONCAT函数:
SELECT OrderID, GROUP_CONCAT(Product SEPARATOR ', ') AS Products FROM YourTableName GROUP BY OrderID;
扩展:如果还有其他同OrderID下一致的字段
如果你的表还有订单日期、客户ID这类同一个OrderID下完全相同的字段,可以一起放到查询里:
-- 以SQL Server为例,其他数据库替换对应的聚合函数即可 SELECT OrderID, CustomerID, OrderDate, STRING_AGG(Product, ', ') AS Products FROM YourTableName GROUP BY OrderID, CustomerID, OrderDate;
小提示
- 记得把代码里的
YourTableName替换成你自己的表名,Product替换成实际存储产品名称的字段名 - 分隔符可以自定义,比如想让产品换行显示,SQL Server里可以用
STRING_AGG(Product, CHAR(10)),MySQL里用GROUP_CONCAT(Product SEPARATOR '\n')
内容的提问来源于stack exchange,提问作者user7146708
相关产品推荐
相关产品推荐

