2013-09-22 61 views
2

怎么可能有一个字段的所有记录到一个场让所有记录在一个字段

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 

谢谢您的帮助

回答

2

使用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] 
+0

+1可爱的答案!我正在考虑使用一个函数,它有一个与自身连接的变量。但这真的很高雅。 –

+0

@PreetSangha只要确保您的数据中没有特殊字符,否则结果不正确,请参阅我的答案 –

1

有是在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; 

sql fiddle demo

主要部分是使用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&lt;-B-&amp;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 
相关问题