SQL Server 多行字段合并为单行的函数实现
本文介绍在 SQL Server 中如何将多个相关行的指定字段(如原因描述)合并为单一字符串,通过自定义函数配合 STUFF 函数消除拼接产生的多余分隔符。
实现原理与场景
在处理报表或汇总数据时,常需将关联的多条记录合并显示。例如,同一订单号下的多条物流异常原因需要汇总展示。核心思路是利用局部变量进行字符串累加,最后使用 STUFF 函数截取有效内容。
环境准备与测试数据
首先构建包含标准编号、数量及对应积压原因的临时表结构,并插入示例数据以验证逻辑。
第1步:创建测试表并插入数据
目的:建立基础数据结构,模拟多对一关系。
入口:SQL Server Management Studio (SSMS) 查询窗口。
动作:执行以下脚本创建表并填充测试用例,注意部分行存在相似但不同的堆积原因。
CREATE TABLE tb(
standards varchar(50),
amount varchar(50),
variation varchar(50),
statuss varchar(50),
Reason varchar(50)
);
-- 插入状态55的数据(同一标准多条原因)
INSERT INTO tb VALUES('55','279','4','物量积压','加工人员设备不足;T排制作进度较慢;');
INSERT INTO tb VALUES('55','279','4','物量积压','部件人员不足;');
INSERT INTO tb VALUES('55','279','4','物量积压','跨间场地积压;图纸问题较多;');
-- 插入状态56的数据(同一标准多条原因)
INSERT INTO tb VALUES('56','300','4','物量积压','AAAA;');
INSERT INTO tb VALUES('56','300','4','物量积压','BBBB;');
INSERT INTO tb VALUES('56','300','4','物量积压','CCCC;');
第2步:编写多行合并函数
目的:封装聚合逻辑,使主查询保持简洁。
入口:新建查询窗口。
动作:创建名为 test 的内联函数。利用 @re 变量遍历符合条件的所有行,将 Reason 字段前追加逗号后累加至末尾。关键点在于返回时使用 STUFF(@re, 1, 1, '') 删除第一个字符(即开头的额外逗号),从而获得干净的拼接字符串。
CREATE FUNCTION test(@standards varchar(100))
RETURNS varchar(8000)
AS
BEGIN
DECLARE @re varchar(500);
SET @re = '';
-- 字符串累积逻辑
SELECT @re = @re + ',' + Reason
FROM tb
WHERE standards = @standards;
-- 去除首个逗号并返回
RETURN (STUFF(@re, 1, 1, ''));
END;
第3步:调用函数执行合并
目的:验证结果并将多行原因整合进主查询输出。
入口:查询窗口。
动作:在主查询中调用该函数,传入对应的 standards 值作为参数。使用 DISTINCT 确保非聚合列的唯一性,观察 Reason 列是否已成功合并。
-- 合并标准 '55' 的原因
SELECT DISTINCT standards, amount, variation, statuss,
Reason = dbo.test('55')
FROM tb
WHERE standards = '55';
-- 合并标准 '56' 的原因
SELECT DISTINCT standards, amount, variation, statuss,
Reason = dbo.test('56')
FROM tb
WHERE standards = '56';
注意事项与优化
- 性能影响:此方法适用于数据量较小的场景。若涉及百万级大表,建议使用 SQL Server 2017+ 的
STRING_AGG()函数替代自定义函数,性能更优且语法更简洁。 - 分隔符处理:上述代码默认使用分号
;作为原字段内部结束符,拼接时增加逗号,区分不同行来源。可根据实际需求调整拼接符号。 - 空值处理:如果某行
Reason为空,可能导致多余逗号,建议在累加前增加ISNULL或条件判断。
以上就是 SQL Server 多行字段合并为单行的详细内容,更多关于 SQL Server 字符串处理与聚合函数的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









