怎么可能有一个字段的所有记录到一个场让所有记录在一个字段
Id, No , FDevice
1 , 1 , 'A'
2 , 1 , 'B'
3 , 1 , 'C'
4 , 2 , 'D'
5 , 2 , 'E'
我想有
No , FDevice
1 , A-B-C
2 , D-E
谢谢您的帮助
怎么可能有一个字段的所有记录到一个场让所有记录在一个字段
Id, No , FDevice
1 , 1 , 'A'
2 , 1 , 'B'
3 , 1 , 'C'
4 , 2 , 'D'
5 , 2 , 'E'
我想有
No , FDevice
1 , A-B-C
2 , D-E
谢谢您的帮助
使用STUFF()
- 将字符串插入另一个字符串。
SELECT
[No],
STUFF(
(SELECT '-' + [FDevice]
FROM TableName
WHERE [No] = a.[No]
FOR XML PATH (''))
, 1, 1, '') AS FDevice
FROM TableName AS a
GROUP BY [No]
有是在SQL Server总串联一个众所周知的解决方案,使用select ... for xml path('')
,但我不得不说,使用它很多人不正确。正确的方式做,这将是
select
a.[No],
stuff(
(
select '-' + t.[FDevice]
from TableName as t
where t.[No] = a.[No]
for xml path(''), type
).value('.', 'nvarchar(max)')
, 1, 1, '') as FDevice
from (select distinct [No] from TableName) as a;
主要部分是使用XML类型的查询中,然后使用value
函数将其转换为VARCHAR,否则你可以结束了与不正确地转换特殊字符如'>', '<', '&'
等等。 SQLfiddle莫名其妙地不显示差异,但这里有一个脚本,可以告诉你如果你不使用xml类型会发生什么:
declare @TableName table
([Id] int, [No] int, [FDevice] varchar(3))
;
INSERT INTO @TableName
([Id], [No], [FDevice])
VALUES
(1, 1, 'A<'),
(2, 1, 'B'),
(3, 1, '&C'),
(4, 2, 'D'),
(5, 2, 'E')
;
SELECT
[No],
STUFF(
(SELECT '-' + [FDevice]
FROM @TableName
WHERE [No] = a.[No]
FOR XML PATH (''))
, 1, 1, '') AS FDevice
FROM @TableName AS a
GROUP BY [No];
outputs
No FDevice
--------------------
1 A<-B-&C
2 D-E
select
a.[No],
stuff(
(
select '-' + t.[FDevice]
from @TableName as t
where t.[No] = a.[No]
for xml path(''), type
).value('.', 'nvarchar(max)')
, 1, 1, '') as FDevice
from (select distinct [No] from @TableName) as a;
outputs
No FDevice
--------------------
1 A<-B-&C
2 D-E
+1可爱的答案!我正在考虑使用一个函数,它有一个与自身连接的变量。但这真的很高雅。 –
@PreetSangha只要确保您的数据中没有特殊字符,否则结果不正确,请参阅我的答案 –