如何编写SQL代码识别并合并含不同折扣的产品重复行?
合并重复产品行并聚合折扣字段的SQL方案
根据你描述的场景(同一产品主键对应多个不同折扣值,需合并为一行展示所有折扣),不同SQL数据库的实现方式略有差异,以下是常用数据库的解决方案:
MySQL/MariaDB
使用GROUP_CONCAT函数聚合折扣值:
SELECT product_id, -- 替换为你的产品主键字段 product_name, -- 替换为其他需要保留的产品属性字段 GROUP_CONCAT(DISTINCT discount SEPARATOR ', ') AS discounts FROM your_table -- 替换为你的表名 GROUP BY product_id, product_name; -- 所有非聚合字段必须放在GROUP BY里
DISTINCT用于剔除重复的折扣值,不需要的话可以去掉SEPARATOR可以自定义分隔符,比如改成'; '
SQL Server
2017及以上版本
用STRING_AGG简化实现:
SELECT product_id, product_name, STRING_AGG(DISTINCT discount, ', ') AS discounts FROM your_table GROUP BY product_id, product_name;
旧版SQL Server(2016及更早)
用FOR XML PATH拼接字符串:
SELECT t1.product_id, t1.product_name, -- 去掉开头多余的分隔符 STUFF((SELECT DISTINCT ', ' + CAST(discount AS VARCHAR(10)) FROM your_table t2 WHERE t2.product_id = t1.product_id AND t2.product_name = t1.product_name FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '') AS discounts FROM your_table t1 GROUP BY t1.product_id, t1.product_name;
PostgreSQL
使用STRING_AGG函数:
SELECT product_id, product_name, STRING_AGG(DISTINCT CAST(discount AS TEXT), ', ') AS discounts FROM your_table GROUP BY product_id, product_name;
注意事项
- 所有不需要聚合的字段(比如产品名称、主键)必须全部包含在
GROUP BY子句中 - 如果折扣是数值类型,部分数据库需要先转换为字符串才能聚合(如PostgreSQL和旧版SQL Server的例子)
- 可根据需求调整分隔符,比如用换行符
CHAR(10)实现分行显示
内容的提问来源于stack exchange,提问作者Ruben
相关产品推荐
相关产品推荐

