SQL查询相同ID多条记录并合并同客户订单号为逗号分隔值
同客户多订单号合并查询方案
需求说明
原始数据表结构如下:
CustID CustName OrderNumber ... 001 John Smith 1234 002 kelly smith 1235 002 kelly smith 4512
期望实现效果:同一个客户存在多条订单记录时,将对应的订单号合并为逗号分隔的字符串返回,结果如下:
CustID CustName OrderNumber ... 001 John Smith 1234 002 kelly smith 1235, 4512
各数据库实现语句
请根据你使用的数据库类型选择对应查询语句,注意替换语句中的你的表名为实际表名。
- MySQL
SELECT CustID, CustName, GROUP_CONCAT(DISTINCT OrderNumber ORDER BY OrderNumber SEPARATOR ', ') AS OrderNumber FROM 你的表名 GROUP BY CustID, CustName;
提示:MySQL默认GROUP_CONCAT返回长度有限制,如果订单数量较多,可提前修改group_concat_max_len参数调整长度上限。
- PostgreSQL
SELECT CustID, CustName, STRING_AGG(DISTINCT OrderNumber::TEXT, ', ' ORDER BY OrderNumber) AS OrderNumber FROM 你的表名 GROUP BY CustID, CustName;
- SQL Server
2017及以上版本:
SELECT CustID, CustName, STRING_AGG(OrderNumber, ', ') WITHIN GROUP (ORDER BY OrderNumber) AS OrderNumber FROM 你的表名 GROUP BY CustID, CustName;
2016及更低版本:
SELECT t1.CustID, t1.CustName, STUFF(( SELECT ', ' + CAST(t2.OrderNumber AS VARCHAR(10)) FROM 你的表名 t2 WHERE t2.CustID = t1.CustID AND t2.CustName = t1.CustName ORDER BY t2.OrderNumber FOR XML PATH(''), TYPE ).value('.', 'VARCHAR(MAX)'), 1, 2, '') AS OrderNumber FROM 你的表名 t1 GROUP BY t1.CustID, t1.CustName;
- Oracle
11gR2及以上版本:
SELECT CustID, CustName, LISTAGG(OrderNumber, ', ') WITHIN GROUP (ORDER BY OrderNumber) AS OrderNumber FROM 你的表名 GROUP BY CustID, CustName;
内容的提问来源于stack exchange,提问作者dustin
相关产品推荐
相关产品推荐

