2014-04-08 137 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