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

如何按proposal_item的detail_number分组拼接关联的tender_number?

解决方案:按detail_number分组拼接tender_number

没问题,这个需求在SQL里完全可以实现,从你用的dbo前缀判断,你应该是用的SQL Server数据库,我给你两种适配不同版本的方案:

方案一:SQL Server 2017及更高版本(推荐)

如果你的数据库版本是2017或更新,直接用官方提供的STRING_AGG函数就行,语法简洁易读:

SELECT 
    a.detail_number,
    STRING_AGG(b.tender_number, ', ') AS tender_number
FROM dbo.proposal_item a
INNER JOIN dbo.proposal_header b ON a.proposal_header_id = b.id
GROUP BY a.detail_number
ORDER BY a.detail_number;

说明:

  • STRING_AGG(列名, 分隔符):专门用来将分组内的指定列值拼接成一个字符串,这里用, 作为分隔符
  • GROUP BY a.detail_number:按detail_number分组,确保每个编号只出现在一行
  • 关联逻辑和你之前的查询一致,通过proposal_header_id关联两张表

执行后就能得到你想要的结果:

detail_number tender_number
161929 BS7, BS12
161932 BS7, BS12
334659 CS14

方案二:SQL Server 2016及更早版本

如果你的数据库版本比较旧,不支持STRING_AGG,可以用STUFF结合FOR XML PATH的经典写法:

SELECT 
    a.detail_number,
    STUFF(
        -- 子查询拼接所有对应的tender_number
        (SELECT ', ' + b.tender_number
         FROM dbo.proposal_header b
         INNER JOIN dbo.proposal_item a2 ON b.id = a2.proposal_header_id
         WHERE a2.detail_number = a.detail_number
         FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),
        1, 2, '' -- 去掉开头多余的', '
    ) AS tender_number
FROM dbo.proposal_item a
GROUP BY a.detail_number
ORDER BY a.detail_number;

说明:

  • FOR XML PATH(''):把子查询的结果转换成无标签的XML字符串,自动把多个tender_number拼接成, BS7, BS12这样的格式
  • TYPE.value('.', 'NVARCHAR(MAX)'):避免XML自动转义特殊字符,把XML转换成普通字符串
  • STUFF(..., 1, 2, ''):从字符串第1位开始删除2个字符,去掉开头的,

这个方案同样能得到你需要的结果集。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:56:58