如何将多行合并为一个?

时间:2014-04-08 22:27:22

标签: sql-server sql-server-2008 tsql coalesce

我正在使用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

4 个答案:

答案 0 :(得分: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 ║
╚════╩═════════╝

答案 1 :(得分: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 :(得分: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

答案 3 :(得分:0)

以下是concatenation using XML PATH()

的标准解决方案
SELECT
   STUFF(
     (
     SELECT
       ',' + Name
     FROM test
     FOR XML PATH(''),TYPE
     ).value('.','VARCHAR(MAX)'
     ), 1, 1, ''
   ) As list

另一个选项可以是使用SQL Server 2012引入的新SQL CONCAT() function。 我在下面的示例中使用了SQL Concat()

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