用于分组的 tsql 聚合字符串
Posted
技术标签:
【中文标题】用于分组的 tsql 聚合字符串【英文标题】:tsql aggregate string for group by 【发布时间】:2011-06-14 19:44:08 【问题描述】:我有两张桌子:
名称(ID,名称) 地址(id、name_id、地址)
我想编写返回我的查询: 姓名、地址列表(地址1、地址2、地址3、..)
类似:
Select A.name, B.list_of_addresses
From Names A
Inner Join (Select name_id, /*list_of_addresses with comma between them*/
From Addresses
Group By name_id) B ON A.id=B.name_id
【问题讨论】:
对于什么版本的 SQL Server? 您可以使用公用表表达式来连接字符串,然后进行其余的查询。 @Ken Downs:你能举个例子吗?我真的不明白。 @OMG Ponies:我使用的是 SQL Server 2005。 【参考方案1】:从 SQL Server 2005 开始,您可以使用 For XML 作为一种技巧来实现这一目标。
Select
A.name,
stuff((
select ',' + B.address
from Addresses B
WHERE A.id=B.name_id
for xml path('')),1,1,'')
From Names A
如果您的地址中没有逗号,它也很有效,但即使有,因为您的要求是在它们之间放置逗号。这可能只是“正确”。
【讨论】:
对于 xml path('') 有什么作用? FOR XML 以 XML 形式返回数据。 Path(x) 为每个节点提供一个标签名称。 Path('') 给出一个空名称,因此节点值(','+B.address)
以纯文本形式结束,而不是在一行中。 STUFF 是一个从列表中删除第一个 ',' 的函数。
你知道如何在 c# 中获取结果吗?结果类型是字符串吗? xml?
第二列是 NVARCHAR(MAX) 列。以上是关于用于分组的 tsql 聚合字符串的主要内容,如果未能解决你的问题,请参考以下文章
TSQL - 将 Sales_Rep 行分组到列并将 DESCRIP 列显示为行 无聚合