怎麼可能有一個字段的所有記錄到一個場讓所有記錄在一個字段
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只要確保您的數據中沒有特殊字符,否則結果不正確,請參閱我的答案 –