Inside SQLServer 2005 读书随笔-用For XML Path来聚合字符串类型

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
go

groupid    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;
GO

MSDN关于FOR XML PATH('')示例说法是:

由此可以得一个完美的查询方案。

转载于:https://www.cnblogs.com/Joe-T/archive/2011/08/11/2134715.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值