Inside SQLServer 2005 读书随笔-用For XML Path来聚合字符串类型
2011-08-11 12:04
513 查看
USE tempdb; GO IFOBJECT_ID('dbo.Groups') ISNOTNULL DROPTABLE dbo.Groups; GO CREATETABLE dbo.Groups ( groupid VARCHAR(10) NOTNULL, memberid INTNOTNULL, string VARCHAR(10) NOTNULL, val INTNOTNULL, PRIMARYKEY (groupid, memberid) ); INSERTINTO dbo.Groups(groupid, memberid, string, val) VALUES('a', 3, 'stra1', 6); INSERTINTO dbo.Groups(groupid, memberid, string, val) VALUES('a', 9, 'stra2', 7); INSERTINTO dbo.Groups(groupid, memberid, string, val) VALUES('b', 2, 'strb1', 3); INSERTINTO dbo.Groups(groupid, memberid, string, val) VALUES('b', 4, 'strb2', 7); INSERTINTO dbo.Groups(groupid, memberid, string, val) VALUES('b', 5, 'strb3', 3); INSERTINTO dbo.Groups(groupid, memberid, string, val) VALUES('b', 9, 'strb4', 11); INSERTINTO dbo.Groups(groupid, memberid, string, val) VALUES('c', 3, 'strc1', 8); INSERTINTO dbo.Groups(groupid, memberid, string, val) VALUES('c', 7, 'strc2', 10); INSERTINTO dbo.Groups(groupid, memberid, string, val) VALUES('c', 9, 'strc3', 12); GO表中数据内容:
groupid memberid string val
---------- ----------- ---------- -----------
a 3 stra1 6
a 9 stra2 7
b 2 strb1 3
b 4 strb2 7
b 5 strb3 3
b 9 strb4 11
c 3 strc1 8
c 7 strc2 10
c 9 strc3 12
现在要根据groupid来分组聚合string字段成类似于数组的形式:"stra1,stra2","strb1,strb2,strb3,strb4".....
传统的方法,不过貌似有点难想到:
Select groupid,Max(Casewhen rn=1then string else''End) +Max(Casewhen rn=2then','+string else''End) +Max(Casewhen rn=3then','+string else''End) +Max(Casewhen rn=4then','+string else''End) AS strs From (Select Groupid,string,ROW_NUMBER() over(partition by groupid orderby memberid) as rn From dbo.Groups) AS T groupby groupid gogroupid strs
---------- -------------------------------------------
a stra1,stra2
b strb1,strb2,strb3,strb4
c strc1,strc2,strc3
还有一中在后来被作者称为专用解决方案和完美解决案的查询:
SELECT groupid, STUFF((SELECT','+ string FROM dbo.Groups AS G2 WHERE G2.groupid = G1.groupid ORDERBY memberid FOR XML PATH('')), 1, 1, '') AS string FROM dbo.Groups AS G1 GROUPBY groupid; GOMSDN关于FOR XML PATH('')示例说法是:
由此可以得一个完美的查询方案。
相关文章推荐
- Inside SQLServer 2005 读书随笔-用For XML Path来聚合字符串类型
- for xml path聚合字符串
- SQL——用FOR XML Path完成字符串的聚合
- sqlserver 用 STUFF 和 for xml path 把查询结果连接成字符串
- 使用 SQL的 for xml path来进行字符串拼接
- 使用 SQL的 for xml path来进行字符串拼接 (group by)
- 使用 SQL的 for xml path来进行字符串拼接
- 《SqlServer 系列》 - for xml path
- sql server 使用for xml path 将1列多行转换为字符串连接起来
- SqlServer 中 for xml path 相关
- SQL-For xml Path 字符串连接
- SQL 字段charindex,stuff,ltrim, for xml path('') 操作字符串 合并查询结果项值
- 《SqlServer 系列》 - 操作XML类型字符串
- sqlserver中FOR XML PATH 的使用
- SQL查询-将列转换成字符串(for xml path)
- MS SQL_使用for xml path 将1列多行转换为字符串连接起来
- Inside Microsoft SQL Server 2005: T-SQL Programming (数据类型|第一章) XML数据类型
- 使用 SQL的 for xml path来进行字符串拼接
- SQLServer中的cross apply和FOR XML PATH
- SQLServer中sql for xml path 的用法