如何使用逗號合併多筆資料到同一欄位
有時候我們會想要將多筆資料合併為一筆顯示,如下面資料中,若想要將同一個 TicketID 的 Person 用逗號間隔,可以這麼做:
CREATE TABLE Tickets (
[TicketID] char(5) NOT NULL,
[Person] nvarchar(15) NOT NULL
)
INSERT INTO Tickets VALUES
('T0001', 'Alice'),
('T0001', 'Bob'),
('T0002', 'Catherine'),
('T0002', 'Doug'),
('T0003', 'Elaine')
使用 Cursor
使用 Cursor 就是跑迴圈。
ALTER PROCEDURE usp_GetPersonList
(@TicketId varchar(max))
AS
DECLARE @Person varchar(Max);
DECLARE @PersonList varchar(Max);
DECLARE _cursor CURSOR FOR
SELECT Person FROM Tickets WHERE TicketId=@TicketId
OPEN _cursor
FETCH NEXT FROM _cursor INTO @Person
SET @PersonList='';
WHILE @@FETCH_STATUS = 0
BEGIN
Set @PersonList = @PersonList + ',' + @Person
FETCH NEXT FROM _cursor INTO @Person
END
IF LEN(@PersonList)>0
SET @PersonList = Substring(@PersonList,2,LEN(@PersonList));
SELECT @PersonList;
CLOSE _cursor
DEALLOCATE _cursor
GO
EXEC usp_GetPersonList 'T0001'
GO

使用變數合併結果
上面的迴圈方法,也可以直接使用一個變數來累加結果,可以更簡便。
DECLARE @PersonList varchar(MAX) SELECT @PersonList = COALESCE(@PersonList + ',' , '') + Person FROM Tickets WHERE TicketID='T0001' SELECT @PersonList
- 上面用到 COALESCE,只是為了方便處理第一個逗號而已。

使用 FOR XML Path
- FOR XML :以資料列集(rowset)的形式取得查詢結果。
1. 首先透過 FOR XML 子句,可以將結果回傳成單一的 XML 格式。
SELECT (',' + Person)
FROM Tickets
WHERE TicketID='T0001'
FOR XML AUTO('')

2. 若是要取得所有群組。
SELECT B.TicketID,
(
SELECT (',' + Person)
FROM Tickets A
WHERE A.TicketID=B.TicketID
FOR XML PATH('')
)
FROM Tickets B
GROUP BY TicketID

3. 修飾第一個逗號。
使用 STUFF 將第一個字取代掉。
SELECT B.TicketID,
STUFF((
SELECT (',' + Person)
FROM Tickets A
WHERE A.TicketID=B.TicketID
FOR XML PATH('')
) , 1, 1, '')
FROM Tickets B
GROUP BY TicketID

如何將逗號間隔資料分成不同資料列
如果有一資料如下:
CREATE TABLE TicketList (
[TicketID] char(5) NOT NULL,
[PersonList] nvarchar(max) NOT NULL
)
INSERT INTO TicketList VALUES
('T0001', 'Alice,Bob'),
('T0002', 'Catherine,Doug,Elaine')
想拆成以下結果:

查詢語法:
;WITH tmp(TicketID, Person, PersonList) as (
select TicketID, LEFT(PersonList, CHARINDEX(',',PersonList+',')-1),
STUFF(PersonList, 1, CHARINDEX(',',PersonList+','), '')
from TicketList
union all
select TicketID, LEFT(PersonList, CHARINDEX(',',PersonList+',')-1),
STUFF(PersonList, 1, CHARINDEX(',',PersonList+','), '')
from tmp
where PersonList > ''
)
select TicketID, Person
from tmp
order by TicketID
結果:

沒有留言:
張貼留言