【学习笔记】SQL语句处理分组合并
背景
今天在博问上看到一个SQL语句需求:
表结构id name
1 罗涛
1 涛帅帅
2 刘亮
2 亮哥
2 亮傻要得出结果
id name
1 罗涛,涛帅帅
2 刘亮,亮哥,亮傻
解决方案
这是一个典型的分组合并的需求,一般有两种方法,一是写一个函数处理,二是用xml for path方法,代码如下:
1 --建立测试环境
2 Create table BWTEST
3 (
4 id Int,
5 name Varchar(10)
6 )
7 GO
8 --插入数据
9 Insert BWTEST Values(1,'罗涛')
10 Insert BWTEST Values(1,'涛帅帅')
11 Insert BWTEST Values(2,'刘亮')
12 Insert BWTEST Values(2,'亮哥')
13 Insert BWTEST Values(2,'亮傻')
14 GO
15
16 --方法一:函数法
17 --创建函数
18 Create Function Getb(@id Int)
19 RETURNS Varchar(8000)
20 AS
21 BEGIN
22 DECLARE @s Varchar(8000)
23 SET @s= ''
24 SELECT @s=@s+','+name FROM BWTEST WHERE id=@id ;
25 RETURN @s
26 END
27 GO
28
29 --调用
30 Select id, Substring(dbo.Getb(id),2,LEN(dbo.Getb(id))-1) as name from BWTEST Group By id;
31
32
33 --方法二:利用XML path法
34 SELECT id,STUFF((SELECT ','+name FROM BWTEST WHERE id=BW.id FOR xml path('')),1,1,'') AS name FROM BWTEST BW GROUP BY id
35
36
37 --删除测试环境
38 Drop Function Getb
39 Drop table BWTEST
40 --结果
41 /*
42 id name
43 ----------- --------
44 1 罗涛,涛帅帅
45 2 刘亮,亮哥,亮傻
46 */
2 Create table BWTEST
3 (
4 id Int,
5 name Varchar(10)
6 )
7 GO
8 --插入数据
9 Insert BWTEST Values(1,'罗涛')
10 Insert BWTEST Values(1,'涛帅帅')
11 Insert BWTEST Values(2,'刘亮')
12 Insert BWTEST Values(2,'亮哥')
13 Insert BWTEST Values(2,'亮傻')
14 GO
15
16 --方法一:函数法
17 --创建函数
18 Create Function Getb(@id Int)
19 RETURNS Varchar(8000)
20 AS
21 BEGIN
22 DECLARE @s Varchar(8000)
23 SET @s= ''
24 SELECT @s=@s+','+name FROM BWTEST WHERE id=@id ;
25 RETURN @s
26 END
27 GO
28
29 --调用
30 Select id, Substring(dbo.Getb(id),2,LEN(dbo.Getb(id))-1) as name from BWTEST Group By id;
31
32
33 --方法二:利用XML path法
34 SELECT id,STUFF((SELECT ','+name FROM BWTEST WHERE id=BW.id FOR xml path('')),1,1,'') AS name FROM BWTEST BW GROUP BY id
35
36
37 --删除测试环境
38 Drop Function Getb
39 Drop table BWTEST
40 --结果
41 /*
42 id name
43 ----------- --------
44 1 罗涛,涛帅帅
45 2 刘亮,亮哥,亮傻
46 */
扩展学习

分类:
.NET
标签:
sql server
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App