2014-04-08 141 views
0

我正在使用SSMS 2008 R2,只是试图将多行合并为一个。我认为这应该很简单,但它目前正在每行重复数据。试想一下:如何将多行合并为一个?

create table test 
(
Name varchar(30) 
) 
insert test values('A'),('B'),('C') 
select * from test 

select distinct Name, coalesce(Name + ', ', '') 
from test 

我怎么可以重写此实现一排这样的: A,B,C

回答

1

在SQL Server的Transact-SQL,做到这一点是下面的最简单的方法。

的表是这样的:

create table #foo 
(
    id int   not null identity(1,1) primary key clustered , 
    name varchar(32) not null , 
) 

insert #foo (name) values ('a') 
insert #foo (name) values ('b') 
insert #foo (name) values ('c') 
insert #foo (name) values ('d') 
go 

可以利用这个看似可疑的(但记录)技术扁平:

declare @text varchar(max) = '' 

select @text = @text 
      + case len(@text) 
       when 0 then '' 
       else  ',' 
       end 
      + t.name 
from #foo t 

select list_of_names = @text 
go 

产生

list_of_names 
------------- 
a,b,c,d 

轻松!

2
SELECT STUFF((SELECT ', ' + Name 
       from #test 
       FOR XML PATH(''), TYPE). 
       value('.','NVARCHAR(MAX)'),1,2,'') 


RESULT: A, B, C 

我相信你行这不是究竟是如何看您尝试来连接,因此,请参阅下面的一个稍微不同的数据集,你将如何去对

测试数据

做这种操作的
create table #test 
(
Id INT, 
Name varchar(30) 
) 
insert #test values 
(1,'A'),(1,'B'),(1,'C'),(2,'E'),(2,'F'),(2,'G') 

查询

select t.Id 
     , STUFF((SELECT ', ' + Name 
       from #test 
       WHERE Id = T.Id 
       FOR XML PATH(''), TYPE). 
       value('.','NVARCHAR(MAX)'),1,2,'') AS List 
FROM #test t 
GROUP BY t.Id 

结果集

╔════╦═════════╗ 
║ Id ║ List ║ 
╠════╬═════════╣ 
║ 1 ║ A, B, C ║ 
║ 2 ║ E, F, G ║ 
╚════╩═════════╝ 
+0

你怎么会作出这样的文本形式的数据表? – sojim2

1
在SQL Server 7.0和SQL Server 2000的旧时代

,我用一个变量来做到这一点,利用COALESCE这样的:

DECLARE @List VARCHAR(8000) 

SELECT @List = COALESCE(@List + ',', '') + CAST(Color AS VARCHAR) 
FROM NameColorTable 

SELECT @List 

但经过SQL Server 2005和XPATH外观上,这款路我更喜欢使用:

SELECT STUFF(( 
    select ','+ cast(Color as nvarchar(255)) 
    from NameColorTable b 
    WHERE a.Name = b.Name 
    FOR XML PATH('') 
    ) 
    ,1,1,'') AS COLUMN2 
FROM NameColorTable a 
GROUP BY a.Name 

我有一个博客帖子这个位置: https://koukia.ca/stuff-vs-coalesce-in-tsql-for-concatenating-row-values-aefb078536f8#.f4iggl22y

0

这里是标准的解决方案

SELECT 
    STUFF(
    (
    SELECT 
     ',' + Name 
    FROM test 
    FOR XML PATH(''),TYPE 
    ).value('.','VARCHAR(MAX)' 
    ), 1, 1, '' 
    ) As list 

另一个选择可能是使用与SQL Server 2012 我下面的示例中使用SQL CONCAT()推出了全新的SQL CONCAT() function

declare @namelist nvarchar(max) 
select @namelist = concat(isnull(@namelist+',',''), name) from test2 
select @namelist