Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于SQL Server中的匹配数据将多行滚动到一行中_Sql_Sql Server - Fatal编程技术网

基于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

我在SQL Server中有一个具有以下布局和一些示例数据的表:

| 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引用,尽管在那篇文章中它没有作为相关子查询记录。添加一个独特的子查询,你就可以把事情搞定了。这很有效,谢谢大家。