用于分组的 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 - 父子(1 到零/多个)分组/聚合

TSQL - 将 Sales_Rep 行分组到列并将 DESCRIP 列显示为行 无聚合

TSQL 数组初始化和 LINQ Where on Array

SQL Server 的分组字符串聚合/LISTAGG

markdown 字符串分组聚合

markdown 字符串分组聚合