如何在MSSQL中合并多行

发布于 2024-11-06 08:08:30 字数 665 浏览 0 评论 0原文

可能的重复:
在 MS SQL Server 2005 中模拟 group_concat MySQL 函数?
SQL Server 中的连接组

我正在尝试编写一个将行组合在一起的 SQL 查询。我需要它按 ID# 将未指定数量的行分组在一起,但将它们的地址连接到一个单元格中。

假设我们有

ID, Address
p1 a1
p1 a2
p1 a3
p2 a4
p2 a5

“我想要获取”,

ID, Address
p1 a1,a2,a3
p2 a4,a5

每个 ID 的地址数量可能会有所不同。有些 ID 有 1 个,其他 ID 有 50 个。

如有任何帮助,我们将不胜感激。提前致谢!

Possible Duplicates:
Simulating group_concat MySQL function in MS SQL Server 2005?
Concat groups in SQL Server

I am trying to write an SQL query that will combine rows together. I need it to group together an unspecified number of rows by ID# but concatenate their addresses let's say into one cell.

Say we have

ID, Address
p1 a1
p1 a2
p1 a3
p2 a4
p2 a5

I want to get

ID, Address
p1 a1,a2,a3
p2 a4,a5

The number of addresses per ID can vary. Some IDs have 1, others can have 50.

Any help would be appreciated. Thanks in advance!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

不语却知心 2024-11-13 08:08:30
Select T1.Id
    , Stuff(
        (
        Select ', ' + T2.Address
        From MyTable As T2
        Where T2.Id = T1.Id
        Order By T2.Address
        For Xml Path(''), type
        ).value('.', 'nvarchar(max)'), 1, 2, '') As Address
From MyTable As T1
Group By T1.Id
Select T1.Id
    , Stuff(
        (
        Select ', ' + T2.Address
        From MyTable As T2
        Where T2.Id = T1.Id
        Order By T2.Address
        For Xml Path(''), type
        ).value('.', 'nvarchar(max)'), 1, 2, '') As Address
From MyTable As T1
Group By T1.Id
望笑 2024-11-13 08:08:30

Coalesce 函数可用于生成该结果。合并返回集合中的第一个非空值。如果按以下方式使用它,它将按顺序递归返回每个值,直到它为空并将其作为逗号分隔的字符串返回。如果需要,您可以使用任何其他分隔符。

DECLARE @pAddr VarChar(MAX)
SELECT @pAddr = COALESCE(@pAddr + ', ', '') + [Address]
FROM AddressTable
WHERE AddressTable.Key = @pKey

您可以将此代码放入 UDF 中,然后在视图中简单地调用传递密钥的 UDF。

The Coalesce function can be used to produce that result. Coalesce returns the first non null value in a set. If you use it in the following manner it will recursivly return each value in order until it nulls out and return it as a comma delimited string. You can use any other delimiter if you want.

DECLARE @pAddr VarChar(MAX)
SELECT @pAddr = COALESCE(@pAddr + ', ', '') + [Address]
FROM AddressTable
WHERE AddressTable.Key = @pKey

You could put this code into a UDF, and then in a view simply call that UDF passing the key.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文