SQL Server分组连接并去重类似Mysql的Group_Concat功能实现
-- 建表 CREATE TABLE TestA(id int, name varchar(10)); -- 插入测试数据 INSERT INTO TestA VALUES(1, 'aa'); INSERT INTO TestA VALUES(1, 'bb'); INSERT INTO TestA VALUES(1, 'bb'); INSERT INTO TestA VALUES(1, 'eeac'); INSERT INTO TestA VALUES(2, 'cc'); INSERT INTO TestA VALUES(2, 'dd'); INSERT INTO TestA VALUES(2, 'dd'); INSERT INTO TestA VALUES(2, 'ff33'); INSERT INTO TestA VALUES(3, '111'); INSERT INTO TestA VALUES(3, '222'); --测试查询 select * from TestA -- FOR XML PATH用法,行转列,将某一字段的所有行值连接为一个字段 SELECT '[ '+name+' ]' FROM TestA FOR XML PATH('') --分组连接方法一: SELECT distinct(id),name = stuff((SELECT ',' + name FROM TestA t WHERE t.id = TestA.id FOR xml path('')) , 1 , 1 , '') FROM TestA --分组连接方法二: --里面一层查出单独的name,拼成一行,然后使用where条件连接外层,最终发现后面会多一个,号 SELECT id, (SELECT name+',' FROM TestA WHERE id=a.id FOR XML PATH('')) AS names FROM TestA a GROUP BY id -- 用Left去掉最后那个空格 SELECT a.id, Left(names,len(names)-1) as names from (SELECT id, (SELECT name+',' FROM TestA WHERE id=a.id FOR XML PATH('')) AS names FROM TestA a GROUP BY id) a --实现分组行转列连接并去重,stuff SELECT distinct(id),name = stuff((SELECT ',' + name FROM TestA t WHERE t.id = TestA.id GROUP BY name FOR xml path('')) , 1 , 1 , '') FROM TestA --实现分组行转列连接并去重,left SELECT a.id, Left(names,len(names)-1) as names from (SELECT id, (SELECT name+',' FROM TestA WHERE id=a.id GROUP BY name FOR XML PATH('')) AS names FROM TestA a GROUP BY id) a --当然这个去重也可以采用distinct来实现 SELECT distinct(id),name = stuff((SELECT distinct ',' + name FROM TestA t WHERE t.id = TestA.id FOR xml path('')) , 1 , 1 , '') FROM TestA
效果:
正常查询:
分组连接成一个字段
分组连接并去重
本文来自博客园,作者:IT情深,转载请注明原文链接:https://www.cnblogs.com/wh445306/p/16751686.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义