2013-09-22 98 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 
相關問題