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

谢谢您的帮助

4

2 回答 2

2

use 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]
于 2013-09-22T10:34:35.840 回答
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
于 2013-09-22T11:14:47.980 回答