SQL多行转单行:如何将客户产品表转换为按客户聚合的表
解决方案:按客户聚合产品为逗号分隔字符串
这个需求核心是分组字符串聚合,不同SQL数据库的实现语法略有差异,下面是主流数据库的具体可行写法:
MySQL/MariaDB
用GROUP_CONCAT()函数,这是MySQL系专门用来做分组字符串拼接的工具:
SELECT customer, GROUP_CONCAT(product SEPARATOR ', ') AS all_products FROM your_table_name GROUP BY customer;
说明:SEPARATOR ', '用来指定分隔符,默认是逗号,显式写出更清晰;如果需要去重产品,可以加DISTINCT参数,比如GROUP_CONCAT(DISTINCT product ...)
PostgreSQL
使用STRING_AGG()函数,这是PostgreSQL的标准字符串聚合函数:
SELECT customer, STRING_AGG(product, ', ') AS all_products FROM your_table_name GROUP BY customer;
如果需要按产品排序后再拼接,可以追加排序规则,比如STRING_AGG(product, ', ') ORDER BY product
SQL Server(2017及以上版本)
同样支持STRING_AGG(),语法和PostgreSQL相近:
SELECT customer, STRING_AGG(product, ', ') AS all_products FROM your_table_name GROUP BY customer;
针对SQL Server 2016及更早版本,可以用STUFF结合FOR XML PATH的兼容写法:
SELECT customer, STUFF( (SELECT ', ' + product FROM your_table_name t2 WHERE t2.customer = t1.customer FOR XML PATH('')), 1, 2, '' ) AS all_products FROM your_table_name t1 GROUP BY customer;
Oracle
使用LISTAGG()函数,这是Oracle官方提供的字符串聚合方案:
SELECT customer, LISTAGG(product, ', ') WITHIN GROUP (ORDER BY product) AS all_products FROM your_table_name GROUP BY customer;
WITHIN GROUP (ORDER BY product)用来指定拼接顺序,可选但推荐加上,让结果更可控
内容的提问来源于stack exchange,提问作者Lgdance
相关产品推荐
相关产品推荐

