You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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;

注意事项

  1. 所有不需要聚合的字段(比如产品名称、主键)必须全部包含在GROUP BY子句中
  2. 如果折扣是数值类型,部分数据库需要先转换为字符串才能聚合(如PostgreSQL和旧版SQL Server的例子)
  3. 可根据需求调整分隔符,比如用换行符CHAR(10)实现分行显示

内容的提问来源于stack exchange,提问作者Ruben

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 02:25:16