基于SQL Server中的匹配数据将多行滚动到一行中
我在SQL Server中有一个具有以下布局和一些示例数据的表:基于SQL Server中的匹配数据将多行滚动到一行中,sql,sql-server,Sql,Sql Server,我在SQL Server中有一个具有以下布局和一些示例数据的表: | ReferenceNumber | TagID | +-----------------+-------+ | 114942 | 1 | | 114942 | 2 | | 114942 | 3 | | 114942 | 4 | | 123456 | 10 | 是否可以将类似ReferenceNumb
| ReferenceNumber | TagID |
+-----------------+-------+
| 114942 | 1 |
| 114942 | 2 |
| 114942 | 3 |
| 114942 | 4 |
| 123456 | 10 |
是否可以将类似ReferenceNumber的行合并为一行,以便:
| ReferenceNumber | TagID |
+-----------------+---------+
| 114942 | 1,2,3,4 |
| 123456 | 10 |
我试过:
select
ReferenceNumber,
stuff((select '; ' + TagID from RefTagTable
for xml path('')), 1, 1,'')[Tags]
from
RefTagTable
order by
ReferenceNumber
哪些产出:
| ReferenceNumber | Tags |
+-----------------+------------+
| 114942 | 1,2,3,4,10 |
| 123456 | 1,2,3,4,10 |
任何帮助都将不胜感激。
谢谢假设这是针对少量(ish)数据,您可以关联子查询。 它嵌套(因此可以认为查询在外部查询中每行运行一次)。 乐观主义者通常会比这更好地进行优化,但这取决于音量是否比其他方法更适合您
DROP TABLE #tags
GO
CREATE TABLE #tags (ReferenceNumber varchar(10), TagId varchar(20))
GO
INSERT INTO #tags (ReferenceNumber , TagId )
SELECT 114942, 1
UNION SELECT 114942, 2
UNION SELECT 114942, 3
UNION SELECT 114942, 4
UNION SELECT 123456, 1
GO
SELECT ReferenceNumber,
stuff((select '; ' + TagID from #Tags AS CorrTagTable WHERE CorrTagTable.ReferenceNumber = Reftagtable.ReferenceNumber
for xml path('')), 1, 1,'')[Tags]
from #tags AS RefTagTable
order by ReferenceNumber
GO
产生:
ReferenceNumber Tags
114942 1; 2; 3; 4
114942 1; 2; 3; 4
114942 1; 2; 3; 4
114942 1; 2; 3; 4
123456 1
这不是滚动或合并,而是聚合,这需要
分组依据
。在SQL Server 2017和更高版本中,您可以使用STRING_AGG
进行此操作。在早期版本中,使用带有空标记名的for XML
用于模拟相同效果。在SQL Server 2017中,您可以编写选择RefNumber,STRING_AGG(',',tag)从RefTagTable GROUP BY RefNumber
中,此查询的问题是它每次聚合所有行,因此对每行重复相同的输出。生成聚合字符串的查询与外部查询之间没有相关性。这是否回答了您的问题?这实际上是Panagio发布的帖子所使用的方法这是问题评论中的Kanavos引用,尽管在那篇文章中它没有作为相关子查询记录。添加一个独特的子查询,你就可以把事情搞定了。这很有效,谢谢大家。