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